# 时间校准

> 来源：https://help.gravity-engine.com/docs/client-sdk/flutter/advanced/time-calibration
> 说明 Gravity Engine Flutter SDK 如何通过时间戳或 NTP 服务器校准事件发生时间，避免设备时间被修改影响分析。



## 1. 通过时间戳校准 [#1-通过时间戳校准]

SDK 默认会使用本机时间作为事件发生时间上报，如果用户手动修改设备时间会影响到您的业务分析，您可以使用从服务端获取的当前时间戳对 SDK 的时间进行校准。此后，所有未指定时间的调用，包括事件数据和用户属性设置操作，都会使用校准后的时间作为发生时间。

### 代码示例 [#代码示例]

```dart
//时间戳,单位毫秒 对应时间为1668982523000 2022-11-21 06:15:23
GravityEngineSDK.calibrateTime(1668982523000);
```

## 2. 通过 NTP 服务器校准 [#2-通过-ntp-服务器校准]

我们也提供了从 NTP 获取时间对 SDK 校准的功能。您需要传入您的用户可以访问的 NTP 服务器地址。之后 SDK 会尝试从传入的 NTP 服务地址中获取当前时间，并对 SDK 时间进行校准。如果在默认的超时时间（3 秒）之内，未获取正确的返回结果，后续将使用本地时间上报数据。

除了以上校准时间接口外，SDK 还提供了所有用户属性接口的时间函数重载，您可以在调用用户属性相关接口时，传入 `DateTime` 对象，则系统会使用传入的 `DateTime` 对象来设定数据的 `time` 字段。

### 代码示例 [#代码示例-1]

```dart
//NTP 时间服务器校准，如：time.apple.com
GravityEngineSDK.calibrateTimeWithNtp("time.apple.com");
```

> **注意**
> * 使用 NTP 服务进行时间校准存在一定的不确定性，建议您优先考虑用时间戳校准的方式
> * 您需要谨慎地选择您的 NTP 服务器地址，以保证网络状况良好的情况下，用户设备可以很快的获取到服务器时间
> * 关于 NTP 服务器相关更多信息请参考：[https://dns.icoa.cn/ntp/](https://dns.icoa.cn/ntp/)
