gpt4 book ai didi

c++ - 如何在C++中将UTC日期和时间转换为time_t?

转载 作者:行者123 更新时间:2023-12-02 10:40:00 25 4
gpt4 key购买 nike

我想将以年,月,日等数字表示的UTC日期和时间转换为time_t。一些系统为此提供了mkgmtimetimegm之类的功能,但这不是标准功能,并且在我的Solaris系统上不存在。

到目前为止,我发现的唯一解决方案是使用setenv将本地时区设置为UTC,然后调用mktime。但是,这种方法不是线程安全的,缓慢的,不可移植的,甚至会在我的系统上产生内存泄漏。

我还看到了尝试使用gmtime确定当前UTC偏移量,然后将其添加到mktime结果中的方法。但据我所知,所有这些方法都有差距。毕竟,从本地时间到UTC的转换不是唯一的。

您认为什么是最佳解决方案?

最佳答案

我决定实现自己的mkgmtime版本,它比我想象的要容易。

const int SecondsPerMinute = 60;
const int SecondsPerHour = 3600;
const int SecondsPerDay = 86400;
const int DaysOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool IsLeapYear(short year)
{
if (year % 4 != 0) return false;
if (year % 100 != 0) return true;
return (year % 400) == 0;
}

time_t mkgmtime(short year, short month, short day, short hour, short minute, short second)
{
time_t secs = 0;
for (short y = 1970; y < year; ++y)
secs += (IsLeapYear(y)? 366: 365) * SecondsPerDay;
for (short m = 1; m < month; ++m) {
secs += DaysOfMonth[m - 1] * SecondsPerDay;
if (m == 2 && IsLeapYear(year)) secs += SecondsPerDay;
}
secs += (day - 1) * SecondsPerDay;
secs += hour * SecondsPerHour;
secs += minute * SecondsPerMinute;
secs += second;
return secs;
}

我的主要担心是 mkgmtime必须与 gmtime保持一致。这样 gmtime(mktime(t))返回原始输入值。因此,我比较了time_t在0和MAX_INT之间的所有61的倍数的结果,它们的确相等(至少在我的系统上)。因此上述例程是正确的。

这个结果也意味着C库没有考虑leap秒,这本身是一件坏事,但对我而言是有好处的。这两个功能将长期保持一致。绝对可以肯定的是,使用此函数的Timestamp类始终对程序启动执行快速检查,并证明几个有意义的值的一致性。

关于c++ - 如何在C++中将UTC日期和时间转换为time_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45700440/

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