Наиболее близким к стандарту было бы описание Jacyll Front Matter . Все остальное, похоже, следует этому. Если Jekyll не изобрел Yaml Front Matter, они были одним из первых замечательных проектов, которые могли бы его отличить.
YAML Lint linter смог проверить компоненты YAML каждого файл, который я выбрал. Согласно спецификации YAML , три-дефис ---
ограничивает документы; один файл YAML может содержать много документов YAML. Содержимое Markdown после дефиса просто отбрасывается linter.
YAML очень свободен и прощает (в основном). Цитирование всех ваших строк не повредит, но вам, вероятно, не нужно беспокоиться.
Желание какого-то базового стандарта Markdown - это то, что привело к проекту CommonMark .
Таким образом, несмотря на отсутствие формальной спецификации, появился образец лучших практик. Придерживаясь этого шаблона, вы получаете некоторые удивительно портативные и универсальные файлы данных.
Вам будут нужны два немного отличающихся преобразования.
Для преобразования от 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 . Их повторное использование кода политика разрешения это.
require 'time'
require 'date'
t = Time.now
d = DateTime.now
dd = DateTime.parse(t.to_s)
tt = Time.parse(d.to_s)
К сожалению, функции 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, включая часовой пояс.