gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:09:17 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 库没有考虑闰秒,这本身是一件坏事,但对我的目的来说是件好事。这两个功能将长期保持一致。可以肯定的是,我使用此函数的 Timestamp 类总是对程序启动执行快速检查,并证明几个有意义的值的一致性。

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

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