Вопрос по timezone, ruby-on-rails-3, date – Летнее время в Rails не учитывается при использовании DateTime.strptime

4

Я работал над разбором строк, и у меня есть тестовый пример, который вызывает у меня проблемы. При разборе строки даты / времени с помощью strptime летнее время НЕ учитывается. Насколько я могу судить, это ошибка. Я не могу найти никаких документов по этой ошибке. Вот тестовый пример в консоли Rails. Это ruby 1.9.3-p215 и Rails 3.2.2.

1.9.3-p125 :049 >   dt = DateTime.strptime("2012-04-15 10:00 Central Time (US & Canada)", "%Y-%m-%d %H:%M %Z")  
=> Sun, 15 Apr 2012 10:00:00 -0600  
1.9.3-p125 :050 > dt = DateTime.strptime("2012-04-15 10:00 Central Time (US & Canada)", "%Y-%m-%d %H:%M %Z").utc  
=> Sun, 15 Apr 2012 16:00:00 +0000  
1.9.3-p125 :051 > dt = DateTime.strptime("2012-04-15 10:00 Central Time (US & Canada)", "%Y-%m-%d %H:%M %Z").utc.in_time_zone("Central Time (US & Canada)")  
=> Sun, 15 Apr 2012 11:00:00 CDT -05:00  

Как вы можете видеть, мне нужно преобразовать в utc, а затем обратно в часовой пояс, чтобы правильно интерпретировать DST, но затем время также сдвигается на один час, так что это не то, что я проанализировал из строки. У кого-нибудь есть обходной путь к этой ошибке или более надежный способ надежного синтаксического анализа даты + времени + часового пояса в объект DateTime, в котором правильно отображается летнее время? Спасибо.

Редактировать: Хорошо, я нашел обходной путь, хотя я не уверен, насколько он надежен.

Вот пример:

ActiveSupport::TimeZone["Central Time (US & Canada)"].parse "2012-04-15 10:00"  

Это разбирает строку даты / времени в правильный часовой пояс. Я не уверен, насколько надежен метод синтаксического анализа для обработки этого, поэтому я хотел бы посмотреть, есть ли лучший обходной путь, но это мой метод до сих пор.

Ваш Ответ

2   ответа
0

вот лучший способ, который я нашел, чтобы справиться с этим до сих пор. Я создал служебный метод в файле lib.

# Returns a DateTime object in the specified timezone
def self.parse_to_date(date_string, num_hours, timezone)
  if timezone.is_a? String
    timezone = ActiveSupport::TimeZone[timezone]
  end

  result = nil
  #Chronic.time_class = timezone # Trying out chronic time zone support - so far it doesn't work
  the_date = Chronic.parse date_string
  if the_date
    # Format the date into something that TimeZone can definitely parse
    date_string = the_date.strftime("%Y-%m-%d")
    result = timezone.parse(date_string) + num_hours.to_f.hours
  end

  result
end

Обратите внимание, что я добавляю часы к времени вручную, потому что Chronic.parse был не таким надежным, как мне хотелось во время синтаксического анализа, - он завершился неудачно, когда к времени не были добавлены конечные нули, например, как в 8: 0 вместо 8:00 ,
Надеюсь это кому-нибудь пригодится. Парсинг строк даты / времени / тимзоны в правильную дату, кажется, очень распространенная вещь, но я не смог найти никакого кода парсинга, который бы объединял все три вместе.

Error: User Rate Limit Exceeded
5

Time.zone.parse, Первое использованиеDateTime.strptime проанализировать строку, а затем запустить ееTime.zone.parse установить зону. Проверьте следующий вывод консоли:

> Time.zone
 => (GMT-06:00) Central Time (US & Canada) 
> input_string = "10/12/12 00:00"
> input_format = "%m/%d/%y %H:%M"
> date_with_wrong_zone = DateTime.strptime(input_string, input_format)
 => Fri, 12 Oct 2012 00:00:00 +0000 
> correct_date = Time.zone.parse(date_with_wrong_zone.strftime('%Y-%m-%d %H:%M:%S'))
 => Fri, 12 Oct 2012 00:00:00 CDT -05:00 

Обратите внимание, что хотяTime.zoneсмещение равно -6 (CST), смещение конечного результата равно -5 (CDT).

Похожие вопросы