据我所知,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的时间#utc?
如果 time 表示UTC(GMT)中的时间,则返回true。
究竟是什么意思"代表UTC / GMT的时间"?显然,偏移量0是不够的。
答案 0 :(得分:5)
实施方面,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 + 0,本地时间的时间实例或具有显式偏移的时间实例也永远不会是utc?
:
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