gpt4 book ai didi

c++ - C++:获取时区偏差

转载 作者:行者123 更新时间:2023-12-01 14:52:33 25 4
gpt4 key购买 nike

所以我想在C++中创建一个格式为HH:MM:SS的时间戳(作为字符串)。我使用std::chrono获取Unix时间戳,然后计算小时,分钟和秒。

// Get unix time stamp in seconds.
const auto unix_time_stamp = std::chrono::system_clock::now();
long long seconds_since_epoch = std::chrono::duration_cast<std::chrono::seconds>(unix_time_stamp.time_since_epoch()).count();

// Calculate current time (hours, minutes, seconds).
uint8_t hours = (seconds_since_epoch % 86400) / 3600;
uint8_t minutes = (seconds_since_epoch % 3600) / 60;
uint8_t seconds = (seconds_since_epoch % 60);

// Create strings for hours, minutes, seconds.
std::string hours_string = std::to_string(hours);
std::string minutes_string = std::to_string(minutes);
std::string seconds_string = std::to_string(seconds);

// Check if the number is only one digit. If it is, add a 0 in the beginning (5:3:9 --> 05:03:09).
if(hours_string.size() == 1)
{
hours_string = "0" + hours_string;
}
if(minutes_string.size() == 1)
{
minutes_string = "0" + minutes_string;
}
if(seconds_string.size() == 1)
{
seconds_string = "0" + seconds_string;
}

// Append to a final string.
std::string time_stamp = hours_string + ":" + minutes_string + ":" + seconds_string;

这一切都很好并且很好,但是存在一个大问题:时区。
这样,我只计算GMT的时间戳。有没有简单,快速,最重要的是 便携式方式,可以在几秒钟,几分钟或几小时内获取系统时区的“偏移”? “便携式”是指与平台无关。

请注意:我知道您可以使用 std::strftime等更轻松地完成所有这些操作,但是我真的想自己实现。

最佳答案

std::tm的某些实现将包含一个具有本地偏移量的成员。 ...但是它不是便携式的。

一个技巧是获取您的seconds_since_epoch,或者将其分配给std::time_t,或者只是首先使其类型为std::time_t而不是long long

...哦,等等,那不是很方便。一些平台仍使用32位time_t。但是假设使用64位time_t ...

然后使用localtime获得std::tm:

std::tm tm = *localtime(&seconds_since_epoch);

这不是官方可移植的,因为 system_clocktime_t不能保证具有相同的纪元。但实际上,它们确实如此。

现在,从 {year, month, day, hour, minute, second}中取出 tm字段,并计算一个“本地纪元”。此计算的难点是将 {year, month, day}部分转换为天数。您可以使用 here中的 days_from_civil有效地执行该计算。执行此操作时,请确保考虑到 tm_yeartm_mon的怪异偏移量。

得到这个后,从中减去 seconds_since_epoch:
 auto offset = local_epoch - seconds_since_epoch;

这是您签署的UTC偏移量(以秒为单位)。正数位于本初子午线以东。

在C++ 20中,这简化为:
auto offset = std::chrono::current_zone()->get_info(system_clock::now()).offset;

offset的类型为 std::chrono::seconds

您可以得到 free, open-source preview of this here。它确实需要一些 installation

关于c++ - C++:获取时区偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62159577/

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