【问题标题】:Poco::LocalDateTime::timestamp() not converting timestamps to UTCPoco::LocalDateTime::timestamp() 未将时间戳转换为 UTC
【发布时间】: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


【解决方案1】:

如果您查看LocalDateTime::timestamp(),您会看到它在通过Timestamp::fromUtcTime 返回之前转换了时间戳,因此该函数返回本地时间的时间戳,而不是UTC 时间。

您可以使用Timestamp::utcTime() 函数或Timestamp::raw() 函数,但它们返回不同的类型,以防止您意外做错事。

您实际上想在这里实现什么目标?

【讨论】:

  • 用户在用户界面中选择一个时间(本地时间)。这个时间需要转换为 UTC 时间戳并存储在数据库中。我的问题不是如何进行转换,而是关于 Poco 的 .timestamp() 相对于文档中指定的行为。
  • 如果我误解了,我很抱歉。您可以使用LocalDateTime::utc()LocalDateTime::utcTime() 获取LocalDateTime 的UTC 时间。
猜你喜欢
  • 2011-10-11
  • 2012-10-07
  • 2013-06-23
  • 2015-12-30
  • 2016-04-10
  • 2019-08-15
  • 2018-08-14
  • 2015-08-19
  • 1970-01-01
相关资源
最近更新 更多