【问题标题】:Understanding Time#utc?了解时间#UTC?
【发布时间】:2018-11-22 16:08:00
【问题描述】:

据我了解,UTC 意味着在时区 +00:00 中给出时间。但 Ruby 在Time#utc? 中的想法不同。我在 Ruby 2.5.1 中观察到了这一点:

a = Time.new(2018,6,13, 9,0,0, '+00:00')
# => 2018-06-13 09:00:00 +0000 

b = Time.utc(2018,6,13, 9,0,0)
# => 2018-06-13 09:00:00 UTC 

a == b 
# => true

a.utc? 
# => false (WHY???)

b.utc?
# => true

恕我直言,a.utc? 应该返回 true。有什么解释吗?

补充:来自Ruby docs for Time#utc?

如果 time 表示 UTC (GMT) 时间,则返回 true。

“以 UTC/GMT 表示时间”究竟是什么意思?显然,偏移量 0 是不够的。

【问题讨论】:

  • UTC 是时间标准,而不是时区。 GMT 是偏移量为 +00:00 的时区。虽然它们大部分是等价的,但不应混淆。 UTC 是时区的偏移量。因此,GMT 与 UTC 的偏移量为 +00:00。从这个意义上说,UTC 没有偏移量,因为它是 from 测量的偏移量。
  • @Stefan 它确实...这是 Ruby 在术语上的错误(将 GMT 与 UTC 而不是 +00:00 相关联)。来自文档:“Time 类将 GMT(格林威治标准时间)和 UTC(协调世界时)视为等效的。GMT 是引用这些基线时间的较旧方式,但在 POSIX 系统上的调用名称中仍然存在.”(强调我的)。
  • 你也可以这样看:2018-06-13 09:00:00 +0000是英国的具体时间; 2018-06-13 09:00:00 UTC无处不在的特定时间。
  • @Stefan 一个小小的挑剔 - 我敢肯定你不是有意这种模棱两可的,但是 - 这些特定时区是同时切换的,就像现在所有时区一样欧洲是使用夏令时的国家之一;但是,在世界其他地区并非如此,many countries 对于何时切换有自己的规则。
  • @Amadan 改写评论会导致至少一个错字。当然:这些 ;-)

标签: ruby time utc


【解决方案1】:

在实现方面,Ruby(即 MRI)的内部 time structure 有一个 gmt 字段,用于指定时间的类型:

PACKED_STRUCT_UNALIGNED(struct time_object {
    wideval_t timew; /* time_t value * TIME_SCALE.  possibly Rational. */
    struct vtm vtm;
    uint8_t gmt:3; /* 0:localtime 1:utc 2:fixoff 3:init */
    uint8_t tm_got:1;
});

utc? 方法只检查gmt 是否为1

因此,本地时间的时间实例或具有显式偏移的时间实例永远不会是utc?,即使您系统的时区偏移量是 UTC+0:

Time.local(2018)      #=> 2018-01-01 00:00:00 +0000
Time.local(2018).utc? #=> false

Time.new(2018)        #=> 2018-01-01 00:00:00 +0000
Time.new(2018).utc?   #=> false

相对于通过utc 创建的时间实例:(注意偏移显示为UTC

Time.utc(2018)        #=> 2018-01-01 00:00:00 UTC
Time.utc(2018).utc?   #=> true

您可以改为查看utc_offset

t = Time.new(2018) #=> 2018-01-01 00:00:00 +0000
t.utc_offset       #=> 0
t.utc_offset.zero? #=> true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 2016-10-02
    • 2015-02-14
    • 2016-05-22
    • 2016-02-16
    • 2017-01-19
    • 2019-03-31
    相关资源
    最近更新 更多