Понимание времени # utc? - PullRequest
0 голосов
/ 13 июня 2018

Как я понимаю, UTC означает, что время указывается в часовом поясе +00: 00.Но Руби думает иначе в 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 для Time # utc?

Возвращает true, если time представляет время в UTC (GMT).

Что именно означает «представление времени в UTC / GMT»?Смещение 0, очевидно, недостаточно.

1 Ответ

0 голосов
/ 13 июня 2018

С точки зрения реализации, внутренняя структура Ruby (т.е. MRI) имеет поле 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
...