吐槽:在线UTC转年月日的网站,没一个做对的吗?

近日,想把负数的UTC时间戳,即1970年之前的时间,转换成可阅读的年/月/日格式。然后悲剧的发现,这个目标用标准C库中的gmtime/mktime/ctime等函数无法实现,原因是不支持UTC时间戳为负数。第一反应是,先到网上寻找在线计算工具。这里以UTC = -3597611104 为例,在各网站上进行试算。

1. Epoch Convert : Online Unix Timestamp Converter

看下图, -3597611104 转换成 GMT后,把它填入右边的格子中,抓换回来发现,时间戳变了、本地时间错乱了,但GMT时间却跟左边相同。

2. 时间戳 UNIX时间戳转换 (Unix timestamp)时间戳转换工具 iP138在线工具

这里,把时间戳抓换成本地时间。然后我们就按这个结果,重新转换回时间戳,如下图,转化后的时间戳跟原来不一样了!

3. 时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu)

转换过程如下,先把时间戳转换成年月日,再转回来。发现,转回来后的时间戳与之前相同,但是这年月日格式的结果肯定是错了,因为时间戳是偶数,但转换后的秒数部分,却是奇数39.

4. Timestamp Converter (timestamp-converter.com)

如下图,这个页面的转换结果也有问题。时间戳是偶数,但本地年月日格式的秒数部分是奇数39。另外,UTC时区和本地时区的时间差不是8小时,这是很不可思议的。

我们把上图中的ISO 8601时间复制到同页面右侧的输入框,得到如下结果。这个结果就错得离谱了!

5. Timestamp Converter

这个页面的转换结果也同样是错误的。

使用 Windows API 计算

尝试用Windows API实现这个目标。

LONGLONG UTCTime = -3597611104LL;
ULARGE_INTEGER LargeInt;
LargeInt.QuadPart = UTCTime * 10000000LL + 116444736000000000LL;
FILETIME FileTime = { LargeInt.LowPart, LargeInt.HighPart };
SYSTEMTIME SystemTime = {};
BOOL ok = FileTimeToSystemTime(&FileTime, &SystemTime);

计算结果是

那么问题来了,以上各种情况,到底哪些是正确的?

`std::chrono`库主要用于处理日期和时间相关的操作,但`time_point`本身并不直接支持换为具体的年月日格式。如果你想从`time_point`获取更详细的日期信息,如年月日,通常需要进行一系列的时间计算和换。 以下是一个简单的示例,展示如何使用`std::chrono`来提取年份、月份和日期: ```cpp #include <iostream> #include <chrono> void printDateFromTimestamp(time_point<system_clock> tp) { // 获取当前时间点与纪元之间的持续时间 auto now = tp.time_since_epoch(); // 换成标准的持续时间(秒) auto durationInSeconds = duration_cast<std::chrono::seconds>(now); // 从秒数换到日期时间对象 auto datetime = system_clock::from_time_t(durationInSeconds.count()); // 提取年、月、日 auto year = std::chrono::system_clock::to_time_t(datetime); auto month_day = localtime(&year); std::cout << "Year: " << month_day->tm_year + 1900 << ", Month: " << month_day->tm_mon + 1 << ", Day: " << month_day->tm_mday << "\n"; } int main() { printTimestamp(); return 0; } ``` 这段代码首先获取了时间戳,然后将其换为`std::chrono::seconds`以获得总秒数。接着,通过调用`system_clock::from_time_t()`将其换回可读的日期时间结构。最后,从这个结构中提取出年、月、日。 注意,这只是一个基本的示例,实际应用中可能需要处理时区差异等问题。如果你需要精确到小时、分钟和秒,可以进一步处理`datetime`对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值