2015-06-08 2 views
0

В моем приложении я используюRuby: Time.parse() Некорректен Возвращение Аляскинского часового пояса

> Time.parse('12:30 pm MDT').utc 
=> 2015-06-08 18:30:00 UTC 
> Time.parse('12:30 pm EDT').utc 
=> 2015-06-08 16:30:00 UTC 
> Time.parse('12:30 pm CDT').utc 
=> 2015-06-08 17:30:00 UTC 
> Time.parse('12:30 pm PDT').utc 
=> 2015-06-08 19:30:00 UTC 
> Time.parse('12:30 pm MST').utc 
=> 2015-06-08 19:30:00 UTC 

Что все работает просто отлично, но как только я начинаю просить Гавайи или Аляскинские часовые пояса, она возвращает ошибочный результат:

> Time.parse('12:30 pm HST').utc 
=> 2015-06-08 12:30:00 UTC 
> Time.parse('12:30 pm HAST').utc 
=> 2015-06-08 12:30:00 UTC 
> Time.parse('12:30 pm AKDT').utc 
=> 2015-06-08 12:30:00 UTC 
> Time.parse('12:30 pm AKST').utc 
=> 2015-06-08 12:30:00 UTC 

Даже это не работает:

> Time.parse('12:30 pm -800').utc 
=> 2015-06-08 12:30:00 UTC 

кто-нибудь есть какие-либо идеи, почему это хап pening? И, что еще важнее, есть ли у кого-нибудь какие-либо советы о том, как разбирать время, равное -800 или -900?

+2

какая у вас Ruby версия? – shivam

+0

Возможно, ваша система не знает, что это за часовые пояса. Какую операционную систему и версию Ruby вы используете? Здесь 'Time.parse ('12: 30 pm HST '). Utc' производит' 2015-06-08 16:30:00 UTC' на Ruby 2.1.5, OS X 10.10, хотя это не время на Гавайях. – tadman

+0

Я тоже на 10.10 и ruby ​​2.1.1 и rails 4.1.1, но я действительно попытался с ruby ​​2.1.5, и это также произвело '2015-06-08 12:30:00 UTC'. Ваш ответ f 'Time.parse ('12: 30 pm HST '). Utc' production' 2015-06-08 16:30:00 UTC' также касается, он должен производить '21:30:00 UTC', справа ? Это рубиновая ошибка? – BananaNeil

ответ

2

The documentation из Time.parse содержит (курсив мой):

Поскольку существуют многочисленные конфликты между локально определенных часового пояса сокращений во всем мире, этот метод не предназначен для понять все из них. Например, аббревиатура «ДКБ» используется по-разному, как:

-06:00 in America/Chicago, 
-05:00 in America/Havana, 
+08:00 in Asia/Harbin, 
+09:30 in Australia/Darwin, 
+10:30 in Australia/Adelaide, 
etc. 

На основании этого факта, этот метод только понимает часовой пояс аббревиатуры, описанный в RFC 822 и часовой пояс системы, в заказ назван. (то есть определение в RFC 822 переопределяет системное время определение зоны.) Системный часовой пояс берется из Time.local(year, 1, 1).zone и Time.local(year, 7, 1).zone. Если выделенное время аббревиатура зоны не соответствует ни одному из них, она игнорируется, и заданное время рассматривается как локальное время.

Ниже из описания синтаксиса в RFC 822 (5.1):

zone  = "UT"/"GMT"    ; Universal Time 
              ; North American : UT 
      /"EST"/"EDT"    ; Eastern: - 5/ - 4 
      /"CST"/"CDT"    ; Central: - 6/ - 5 
      /"MST"/"MDT"    ; Mountain: - 7/ - 6 
      /"PST"/"PDT"    ; Pacific: - 8/ - 7 
      /1ALPHA      ; Military: Z = UT; 
              ; A:-1; (J not used) 
              ; M:-12; N:+1; Y:+12 
      /(("+"/"-") 4DIGIT)  ; Local differential 
              ; hours+min. (HHMM) 

Как вы можете видеть ваши имена часовых поясов не упоминаются. Вы должны написать -0800 и -0900 в качестве начального нуля (в соответствии с разделом 4DIGIT). Если вы хотите или должны сохранить имена, может использоваться более сложный класс DateTime.

Time.parse('12:30 pm -0800').utC# => 2015-06-08 20:30:00 UTC 
DateTime.parse('12:30 pm AKDT').to_time.utC# => 2015-06-08 20:30:00 UTC 
Смежные вопросы