пятница, 31 августа 2012 г.

Ruby: класс Time — немного о грустном

Обнаружил не очень правильное поведение Ruby при преобразовании времени между поясным и универсальным — следующий код:

local = Time.now

puts "local\t= #{local}"

utc = local.utc

puts "utc\t= #{utc}"
puts "local\t= #{local}"

выводит:

local   = 2012-08-31 05:53:48 +0600
utc     = 2012-08-30 23:53:48 UTC
local   = 2012-08-30 23:53:48 UTC

Т.е. метод utc не только выдает соответствующее универсальное время, но и приводит к нему задействованный объект. Причем, восклицательного знака в имени метода нет... Проблема, естественно, обходится методом dup.

И еще одна неприятная тонкость:

require 'time'

before = Time.now
string = before.xmlschema
after = Time.xmlschema(string)
other = Time.parse(string)

puts "before\t= #{before}"
puts "string\t= #{string.inspect}"
puts "after\t= #{after}"
puts "other\t= #{other}"

Выдает:

before  = 2012-08-31 05:53:48 +0600
string  = "2012-08-31T05:53:48+06:00"
after   = 2012-08-30 23:53:48 UTC
other   = 2012-08-31 05:53:48 +0600

Иначе говоря, метод класса Time.xmlschema() всегда приводит результат к UTC. Это особенно интересно тем, что метод Time.parse() тот же самый формат строки разбирает абсолютно корректно — выставляя правильную зону.

Комментариев нет:

Отправить комментарий