Конвертировать в / из DateTime и Время в Ruby

Наиболее близким к стандарту было бы описание Jacyll Front Matter . Все остальное, похоже, следует этому. Если Jekyll не изобрел Yaml Front Matter, они были одним из первых замечательных проектов, которые могли бы его отличить.

YAML Lint linter смог проверить компоненты YAML каждого файл, который я выбрал. Согласно спецификации YAML , три-дефис --- ограничивает документы; один файл YAML может содержать много документов YAML. Содержимое Markdown после дефиса просто отбрасывается linter.

YAML очень свободен и прощает (в основном). Цитирование всех ваших строк не повредит, но вам, вероятно, не нужно беспокоиться.

Желание какого-то базового стандарта Markdown - это то, что привело к проекту CommonMark .

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

129
задан Readonly 11 November 2008 в 01:31
поделиться

3 ответа

Вам будут нужны два немного отличающихся преобразования.

Для преобразования от Time до DateTime можно исправить класс Времени следующим образом:

require 'date'
class Time
  def to_datetime
    # Convert seconds + microseconds into a fractional number of seconds
    seconds = sec + Rational(usec, 10**6)

    # Convert a UTC offset measured in minutes to one measured in a
    # fraction of a day.
    offset = Rational(utc_offset, 60 * 60 * 24)
    DateTime.new(year, month, day, hour, min, seconds, offset)
  end
end

Подобные корректировки до настоящего времени позволят Вам преобразовать DateTime в Time .

class Date
  def to_gm_time
    to_time(new_offset, :gm)
  end

  def to_local_time
    to_time(new_offset(DateTime.now.offset-offset), :local)
  end

  private
  def to_time(dest, method)
    #Convert a fraction of a day to a number of microseconds
    usec = (dest.sec_fraction * 60 * 60 * 24 * (10**6)).to_i
    Time.send(method, dest.year, dest.month, dest.day, dest.hour, dest.min,
              dest.sec, usec)
  end
end

Примечание, которое необходимо выбрать между временем GM/UTC и местным временем.

Оба вышеупомянутые фрагменты кода взяты от O'Reilly Поваренная книга Ruby . Их повторное использование кода политика разрешения это.

48
ответ дан Felixyz 11 November 2008 в 01:31
поделиться
  • 1
    @Edmund: Гм... прежде всего реализация со знаком не определяется, и как следствие поведение битовых операций (как сдвиг вправо) и модуля и деления является реализацией, определенной на отрицательных целых числах. Что другие вещи имеют Вас в памяти, которые определяются реализацией? – Kerrek SB 25 August 2011 в 10:24
require 'time'
require 'date'

t = Time.now
d = DateTime.now

dd = DateTime.parse(t.to_s)
tt = Time.parse(d.to_s)
180
ответ дан anshul 11 November 2008 в 01:31
поделиться

К сожалению, функции DateTime.to_time, Time.to_datetime и Time.parse не сохраняют информацию о часовом поясе. Все преобразуется в местный часовой пояс во время преобразования. Арифметика дат по-прежнему работает, но вы не сможете отобразить даты с их оригинальными часовыми поясами. Эта контекстная информация часто важна. Например, если я хочу видеть транзакции, выполненные в рабочее время в Нью-Йорке, я, вероятно, предпочту, чтобы они отображались в исходном часовом поясе, а не в моем местном часовом поясе в Австралии (который на 12 часов опережает Нью-Йорк).

Приведенные ниже методы преобразования сохраняют информацию о tz.

Для Ruby 1.8 посмотрите на ответ Гордона Уилсона. Он взят из старой доброй надежной Ruby Cookbook.

Для Ruby 1.9 все немного проще.

require 'date'

# Create a date in some foreign time zone (middle of the Atlantic)
d = DateTime.new(2010,01,01, 10,00,00, Rational(-2, 24))
puts d

# Convert DateTime to Time, keeping the original timezone
t = Time.new(d.year, d.month, d.day, d.hour, d.min, d.sec, d.zone)
puts t

# Convert Time to DateTime, keeping the original timezone
d = DateTime.new(t.year, t.month, t.day, t.hour, t.min, t.sec, Rational(t.gmt_offset / 3600, 24))
puts d

Это выводит следующее

2010-01-01T10:00:00-02:00
2010-01-01 10:00:00 -0200
2010-01-01T10:00:00-02:00

Сохраняется полная исходная информация о DateTime, включая часовой пояс.

11
ответ дан 24 November 2019 в 00:29
поделиться
Другие вопросы по тегам:

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