【发布时间】:2020-01-30 09:57:30
【问题描述】:
根据Poco::Timestamp的头文件,时间戳是UTC,见Timestamp documentation。如果时间戳采用 UTC 格式,那么将 Poco::LocalDateTime 转换为 Poco::Timestamp 的方法不应该确保返回的时间戳采用 UTC 格式吗?目前Poco::LocalDateTime::timestamp()不这样做,返回的时间戳是本地时间。
这特别奇怪,因为赋值运算符Poco::LocalDateTime::operator = (const Timestamp& timestamp) 将UTC 转换为本地时间。因此,以下代码断言:
Poco::LocalDateTime local1 = Poco::LocalDateTime( 2020, 1, 30 );
Poco::Timestamp timestamp = local1.timestamp();
Poco::LocalDateTime local2 = timestamp;
assert( local1 == local2 );
local1 在此示例中与local2 的值不同。只有我一个人认为这是奇怪的行为吗?
【问题讨论】:
-
解决方法:
Poco::Timestamp timestampFromLocalTime = Poco::Timestamp::fromUtcTime( Poco::LocalDateTime( 1970, 1, 1 ).utcTime() ); -
如果您查看
LocalDateTime::timestamp(),您会看到它在通过Timestamp::fromUtcTime返回之前转换了时间戳,因此该函数返回本地时间的时间戳,而不是UTC 时间。 -
您可以使用
Timestamp::utcTime()函数或Timestamp::raw()函数,但它们返回不同的类型,以防止您不小心做错事。您实际上想在这里实现什么目标? -
@cookie-butter,您说:“该函数返回当地时间的时间戳”。文档说:“时间戳为 UTC”。这就是我的观点。
-
是的,我现在明白你的意思了。我认为这与确定Tzd 函数有关。从时间戳构造 LocalDateTime 时,它会从操作系统确定 _tzd。对于 2 个 LocalDateTime 对象,该增量可能会略微偏离。你可能需要对你的平等检查有一个容忍度。
标签: poco-libraries