gpt4 book ai didi

c++ - 如何在给定时钟偏移的情况下正确获取时间

转载 作者:行者123 更新时间:2023-11-30 04:42:30 24 4
gpt4 key购买 nike

我想根据系统时间和时钟偏移(从 NTP 服务器找到)创建一个时间戳 (HHMMSSmmm)。我遇到的问题是有时时间戳设置不正确,例如当时间戳为 112400023 且偏移量为 -500 时,将其设置为 112359523 而不是 112359523。

如果发生这种情况,我想将结果减去 40 秒,但我想知道是否有更好的方法来处理所有情况,而不管偏移量如何?

这些是我的案例中使用的函数(其中 GetMillisecondsTs() 是返回时间戳的函数)。

void
Timestamp::gettimeofday(struct timeval* tp)
{
// Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's
// This magic number is the number of 100 nanosecond intervals since January 1, 1601 (UTC)
// until 00:00:00 January 1, 1970
static const uint64_t EPOCH = ((uint64_t)116444736000000000ULL);

SYSTEMTIME system_time;
FILETIME file_time;
uint64_t time;

GetSystemTime(&system_time);
SystemTimeToFileTime(&system_time, &file_time);
time = ((uint64_t)file_time.dwLowDateTime);
time += ((uint64_t)file_time.dwHighDateTime) << 32;

tp->tv_sec = (long)((time - EPOCH) / 10000000L);
tp->tv_usec = (long)(system_time.wMilliseconds * 1000);
}

uint32_t
Timestamp::GetMillisecondsTs(int offset)
{
struct timeval unix;
gettimeofday(&unix);

int hour = (unix.tv_sec % 86400L) / 3600;
int minute = (unix.tv_sec % 3600) / 60;
int second = (unix.tv_sec % 60);
int millisecond = (unix.tv_usec) / 1000; //keep only the first three decimals (since offset is 3 decimals)

ostringstream _ss;
_ss << std::internal << std::setfill('0') << std::setw(2) << hour << std::internal << std::setfill('0') << std::setw(2) << minute
<< std::internal << std::setfill('0') << std::setw(2) << second << std::internal << std::setfill('0') << std::setw(3) << millisecond;

std::string _s = _ss.str();
uint32_t _milliseconds = stoul(_s);
_milliseconds += offset;

return _milliseconds;
}

最佳答案

这个怎么样。在转换时间之前添加偏移量

uint32_t
Timestamp::GetMillisecondsTs(int offset)
{
struct timeval unix;
gettimeofday(&unix);

unix.tv_sec += offset / 1000;
unix.tv_usec += (offset % 1000) * 1000;
if (unix.tv_usec < 0) {
unix.tv_sec--;
unix.tv_usec += 1000000;
}
if (unix.tv_usec >= 1000000) {
unix.tv_sec++;
unix.tv_usec -= 1000000;
}

int hour = (unix.tv_sec % 86400L) / 3600;
int minute = (unix.tv_sec % 3600) / 60;
int second = (unix.tv_sec % 60);
int millisecond = unix.tv_usec / 1000;

return hour * 10000000 + minute * 100000 + second * 1000 + millisecond;
}

另请注意,您不需要转换为字符串并返回。

关于c++ - 如何在给定时钟偏移的情况下正确获取时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58710984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com