网络状态不好时间时区同步

Signed-off-by: guduhanyan <xuyanjun27@163.com>
This commit is contained in:
liulinna
2022-03-17 18:45:36 +08:00
committed by guduhanyan
parent ad45bf22ed
commit de22fa2502
2 changed files with 50 additions and 7 deletions
@@ -42,6 +42,7 @@ private:
void SubscriberNITZTimeChangeCommonEvent();
void StartTimer();
void SetSystemTime();
bool ThreadSetSystemTime();
void RefreshNextTriggerTime();
bool CheckStatus();
bool IsNITZTimeInvalid();
+49 -7
View File
@@ -32,13 +32,15 @@ using namespace std::chrono;
namespace OHOS {
namespace MiscServices {
namespace {
constexpr uint64_t NANO_TO_MILESECOND = 1000000;
constexpr uint64_t NANO_TO_MILLISECOND = 1000000;
constexpr uint64_t DAY_TO_MILLISECOND = 86400000;
constexpr uint64_t MINUTES_TO_SECOND = 60;
const std::string AUTOTIME_FILE_PATH = "/data/misc/zoneinfo/autotime.json";
const std::string NETWORK_TIME_STATUS_ON = "ON";
const std::string NETWORK_TIME_STATUS_OFF = "OFF";
const std::string NTP_CN_SERVER = "1.cn.pool.ntp.org";
const std::string NTP_CN_SERVER = "ntp.aliyun.com";
const int64_t INVALID_TIMES = -1;
const int MAX_RETRY = 10;
}
NtpUpdateTime::NtpUpdateTime() {};
@@ -64,6 +66,19 @@ void NtpUpdateTime::Init()
if (autoTimeInfo_.status == NETWORK_TIME_STATUS_ON) {
SetSystemTime();
}
std::thread([&]{
for (int i = 0; i < MAX_RETRY; i++) {
if (!ThreadSetSystemTime()) {
TIME_HILOGE(TIME_MODULE_SERVICE, "thread set ntp time failed, retry");
this_thread::sleep_for(seconds(MINUTES_TO_SECOND));
} else {
TIME_HILOGD(TIME_MODULE_SERVICE, "thread set ntp time success");
break;
}
}
}).detach();
int32_t timerType = ITimerManager::TimerType::ELAPSED_REALTIME;
auto callback = [this](uint64_t id) {
this->RefreshNetworkTimeByTimer(id);
@@ -91,7 +106,7 @@ void NtpUpdateTime::SubscriberNITZTimeChangeCommonEvent()
}
}
void NtpUpdateTime::RefreshNetworkTimeByTimer(const uint64_t timerId)
void NtpUpdateTime::_RefreshNetworkTimeByTimer(const uint64_t timerId)
{
if (!(CheckStatus())) {
TIME_HILOGD(TIME_MODULE_SERVICE, "Network time status off.");
@@ -109,7 +124,7 @@ void NtpUpdateTime::RefreshNetworkTimeByTimer(const uint64_t timerId)
void NtpUpdateTime::UpdateNITZSetTime()
{
auto BootTimeNano = steady_clock::now().time_since_epoch().count();
auto BootTimeMilli = BootTimeNano / NANO_TO_MILESECOND;
auto BootTimeMilli = BootTimeNano / NANO_TO_MILLISECOND;
TIME_HILOGD(TIME_MODULE_SERVICE, "nitz time changed.");
nitzUpdateTimeMili_ = BootTimeMilli;
}
@@ -140,11 +155,38 @@ void NtpUpdateTime::SetSystemTime()
TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
}
bool NtpUpdateTime::ThreadSetSystemTime()
{
TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
if (!DelayedSingleton<NtpTrustedTime>::GetInstance()->ForceRefresh(autoTimeInfo_.NTP_SERVER)) {
TIME_HILOGE(TIME_MODULE_SERVICE, "get ntp time failed.");
return false;
}
int64_t currentTime = DelayedSingleton<NtpTrustedTime>::GetInstance()->CurrentTimeMillis();
if (currentTime == INVALID_TIMES) {
TIME_HILOGD(TIME_MODULE_SERVICE, "Ntp update time failed");
return false;
}
if (currentTime <= 0) {
TIME_HILOGD(TIME_MODULE_SERVICE, "current time invalid.");
return false;
}
TIME_HILOGD(TIME_MODULE_SERVICE, "Ntp UTC Time: %{public}" PRId64 "", currentTime);
auto timeOffsetMs = DelayedSingleton<TimeZoneInfo>::GetInstance()->GetCurrentOffsetMs();
currentTime = currentTime + timeOffsetMs;
TIME_HILOGD(TIME_MODULE_SERVICE, "Ntp UTC+TIMEZONE tTime: %{public}" PRId64 "", currentTime);
TimeService::GetInstance()->SetTime(currentTime);
autoTimeInfo_.lastUpdateTime = currentTime;
TIME_HILOGD(TIME_MODULE_SERVICE, "Ntp update currentTime: %{public}" PRId64 "", currentTime);
TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
return ture;
}
void NtpUpdateTime::RefreshNextTriggerTime()
{
auto BootTimeNano = steady_clock::now().time_since_epoch().count();
auto BootTimeMilli = BootTimeNano / NANO_TO_MILESECOND;
nextTriggerTime_ = BootTimeMilli + DAY_TO_MILLISECOND;
auto BootTimeMilli = BootTimeNano / NANO_TO_MILLISECOND;
nextTriggerTime_ = BootTimeMilli + DAY_TO_MILLISECOND;
}
void NtpUpdateTime::UpdateStatusOff()
@@ -182,7 +224,7 @@ bool NtpUpdateTime::CheckStatus()
bool NtpUpdateTime::IsNITZTimeInvalid()
{
auto BootTimeNano = steady_clock::now().time_since_epoch().count();
auto BootTimeMilli = BootTimeNano / NANO_TO_MILESECOND;
auto BootTimeMilli = BootTimeNano / NANO_TO_MILLISECOND;
return (BootTimeMilli - nitzUpdateTimeMili_) < DAY_TO_MILLISECOND;
}