С точки зрения реализации, внутренняя структура 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