Форматы дат и времени
Несколько классов Ruby, связанных со временем, имеют метод экземпляра strftime, который возвращает форматированную строку, представляющую всю дату или время либо их часть:
Каждый из этих методов принимает необязательный аргумент format, который может содержать ноль или более встроенных спецификаций формата (см. ниже).
Каждый из этих методов возвращает строку, полученную заменой каждой спецификации формата, встроенной в format, строковым представлением одной или нескольких частей даты или времени.
Простой пример:
Time.now.strftime('%H:%M:%S') # => "14:02:07"
Спецификация формата имеет следующий вид:
%[flags][width]conversion
Она состоит из:
-
Начального символа процента.
-
Нуля или более флагов (каждый из которых является символом).
-
Необязательного спецификатора ширины (целого числа).
-
Спецификатора преобразования (символа).
За исключением начального символа процента, обязательной является только спецификация преобразования, поэтому начнём с неё.
Спецификаторы преобразования
Дата (год, месяц, день)
-
%Y— год с указанием века, дополненный нулями:Time.now.strftime('%Y') # => "2022" Time.new(-1000).strftime('%Y') # => "-1000" # Before common era. Time.new(10000).strftime('%Y') # => "10000" # Far future. Time.new(10).strftime('%Y') # => "0010" # Zero-padded by default. -
%y— год без указания века, в диапазоне (0..99), дополненный нулями:Time.now.strftime('%y') # => "22" Time.new(1).strftime('%y') # => "01" # Zero-padded by default. -
%C— век, дополненный нулями:Time.now.strftime('%C') # => "20" Time.new(-1000).strftime('%C') # => "-10" # Before common era. Time.new(10000).strftime('%C') # => "100" # Far future. Time.new(100).strftime('%C') # => "01" # Zero-padded by default. -
%m— месяц года в диапазоне (1..12), дополненный нулями:Time.new(2022, 1).strftime('%m') # => "01" # Zero-padded by default. Time.new(2022, 12).strftime('%m') # => "12" -
%B— полное название месяца с заглавной буквы:Time.new(2022, 1).strftime('%B') # => "January" Time.new(2022, 12).strftime('%B') # => "December" -
%b— сокращённое название месяца с заглавной буквы:Time.new(2022, 1).strftime('%b') # => "Jan" Time.new(2022, 12).strftime('%h') # => "Dec" -
%h— то же, что и%b. -
%d— день месяца в диапазоне (1..31), дополненный нулями:Time.new(2002, 1, 1).strftime('%d') # => "01" Time.new(2002, 1, 31).strftime('%d') # => "31" -
%e— день месяца в диапазоне (1..31), дополненный пробелами:Time.new(2002, 1, 1).strftime('%e') # => " 1" Time.new(2002, 1, 31).strftime('%e') # => "31" -
%j— день года в диапазоне (1..366), дополненный нулями:Time.new(2002, 1, 1).strftime('%j') # => "001" Time.new(2002, 12, 31).strftime('%j') # => "365"
Время (часы, минуты, секунды, доли секунды)
-
%H— час дня в диапазоне (0..23), дополненный нулями:Time.new(2022, 1, 1, 1).strftime('%H') # => "01" Time.new(2022, 1, 1, 13).strftime('%H') # => "13" -
%k— час дня в диапазоне (0..23), дополненный пробелами:Time.new(2022, 1, 1, 1).strftime('%k') # => " 1" Time.new(2022, 1, 1, 13).strftime('%k') # => "13" -
%I— час дня в диапазоне (1..12), дополненный нулями:Time.new(2022, 1, 1, 1).strftime('%I') # => "01" Time.new(2022, 1, 1, 13).strftime('%I') # => "01" -
%l— час дня в диапазоне (1..12), дополненный пробелами:Time.new(2022, 1, 1, 1).strftime('%l') # => " 1" Time.new(2022, 1, 1, 13).strftime('%l') # => " 1" -
%P— обозначение времени до или после полудня, строчными буквами:Time.new(2022, 1, 1, 1).strftime('%P') # => "am" Time.new(2022, 1, 1, 13).strftime('%P') # => "pm" -
%p— обозначение времени до или после полудня, прописными буквами:Time.new(2022, 1, 1, 1).strftime('%p') # => "AM" Time.new(2022, 1, 1, 13).strftime('%p') # => "PM" -
%M— минута часа в диапазоне (0..59), дополненная нулями:Time.new(2022, 1, 1, 1, 0, 0).strftime('%M') # => "00" -
%S— секунда минуты в диапазоне (0..59), дополненная нулями:Time.new(2022, 1, 1, 1, 0, 0, 0).strftime('%S') # => "00" -
%L— миллисекунда секунды в диапазоне (0..999), дополненная нулями:Time.new(2022, 1, 1, 1, 0, 0, 0).strftime('%L') # => "000" -
%N— доли секунды; ширина по умолчанию — 9 цифр (наносекунды):t = Time.now # => 2022-06-29 07:10:20.3230914 -0500 t.strftime('%N') # => "323091400" # Default.Для настройки единиц используйте спецификаторы ширины:
t.strftime('%3N') # => "323" # Milliseconds. t.strftime('%6N') # => "323091" # Microseconds. t.strftime('%9N') # => "323091400" # Nanoseconds. t.strftime('%12N') # => "323091400000" # Picoseconds. t.strftime('%15N') # => "323091400000000" # Femptoseconds. t.strftime('%18N') # => "323091400000000000" # Attoseconds. t.strftime('%21N') # => "323091400000000000000" # Zeptoseconds. t.strftime('%24N') # => "323091400000000000000000" # Yoctoseconds. -
%s— количество секунд, прошедших с начала эпохи:Time.now.strftime('%s') # => "1656505136"
Часовой пояс
-
%z— часовой пояс в виде смещения от UTC в часах и минутах:Time.now.strftime('%z') # => "-0500" -
%Z— название часового пояса (зависит от платформы):Time.now.strftime('%Z') # => "Central Daylight Time"
День недели
-
%A— полное название дня недели:Time.now.strftime('%A') # => "Wednesday" -
%a— сокращённое название дня недели:Time.now.strftime('%a') # => "Wed" -
%u— день недели в диапазоне (1..7), понедельник — 1:t = Time.new(2022, 6, 26) # => 2022-06-26 00:00:00 -0500 t.strftime('%a') # => "Sun" t.strftime('%u') # => "7" -
%w— день недели в диапазоне (0..6), воскресенье — 0:t = Time.new(2022, 6, 26) # => 2022-06-26 00:00:00 -0500 t.strftime('%a') # => "Sun" t.strftime('%w') # => "0"
Номер недели
-
%U— номер недели в году в диапазоне (0..53), дополненный нулями; неделя начинается в воскресенье:t = Time.new(2022, 6, 26) # => 2022-06-26 00:00:00 -0500 t.strftime('%a') # => "Sun" t.strftime('%U') # => "26" -
%W— номер недели в году в диапазоне (0..53), дополненный нулями; неделя начинается в понедельник:t = Time.new(2022, 6, 26) # => 2022-06-26 00:00:00 -0500 t.strftime('%a') # => "Sun" t.strftime('%W') # => "25"
Даты недель
См. даты недель ISO 8601.
t0 = Time.new(2023, 1, 1) # => 2023-01-01 00:00:00 -0600 t1 = Time.new(2024, 1, 1) # => 2024-01-01 00:00:00 -0600
-
%G— год, определяемый нумерацией недель:t0.strftime('%G') # => "2022" t1.strftime('%G') # => "2024" -
%g— год, определяемый нумерацией недель, без указания века, в диапазоне (0..99), дополненный нулями:t0.strftime('%g') # => "22" t1.strftime('%g') # => "24" -
%V— номер недели года, определяемого нумерацией недель, в диапазоне (1..53), дополненный нулями:t0.strftime('%V') # => "52" t1.strftime('%V') # => "01"
Литералы
-
%n— символ новой строки «n»:Time.now.strftime('%n') # => "\n" -
%t— символ табуляции «t»:Time.now.strftime('%t') # => "\t" -
%%— символ процента «%»:Time.now.strftime('%%') # => "%"
Сокращённые спецификаторы преобразования
Здесь каждый сокращённый спецификатор показан вместе с соответствующим полным спецификатором.
-
%c— дата и время:Time.now.strftime('%c') # => "Wed Jun 29 08:01:41 2022" Time.now.strftime('%a %b %e %T %Y') # => "Wed Jun 29 08:02:07 2022" -
%D— дата:Time.now.strftime('%D') # => "06/29/22" Time.now.strftime('%m/%d/%y') # => "06/29/22" -
%F— дата ISO 8601:Time.now.strftime('%F') # => "2022-06-29" Time.now.strftime('%Y-%m-%d') # => "2022-06-29" -
%v— дата в формате VMS:Time.now.strftime('%v') # => "29-JUN-2022" Time.now.strftime('%e-%^b-%4Y') # => "29-JUN-2022" -
%x— то же, что и%D. -
%X— то же, что и%T. -
%r— время в 12-часовом формате:Time.new(2022, 1, 1, 1).strftime('%r') # => "01:00:00 AM" Time.new(2022, 1, 1, 1).strftime('%I:%M:%S %p') # => "01:00:00 AM" Time.new(2022, 1, 1, 13).strftime('%r') # => "01:00:00 PM" Time.new(2022, 1, 1, 13).strftime('%I:%M:%S %p') # => "01:00:00 PM" -
%R— время в 24-часовом формате:Time.new(2022, 1, 1, 1).strftime('%R') # => "01:00" Time.new(2022, 1, 1, 1).strftime('%H:%M') # => "01:00" Time.new(2022, 1, 1, 13).strftime('%R') # => "13:00" Time.new(2022, 1, 1, 13).strftime('%H:%M') # => "13:00" -
%T— время в 24-часовом формате:Time.new(2022, 1, 1, 1).strftime('%T') # => "01:00:00" Time.new(2022, 1, 1, 1).strftime('%H:%M:%S') # => "01:00:00" Time.new(2022, 1, 1, 13).strftime('%T') # => "13:00:00" Time.new(2022, 1, 1, 13).strftime('%H:%M:%S') # => "13:00:00" -
%+(не поддерживается вTime#strftime) — дата и время:DateTime.now.strftime('%+') # => "Wed Jun 29 08:31:53 -05:00 2022" DateTime.now.strftime('%a %b %e %H:%M:%S %Z %Y') # => "Wed Jun 29 08:32:18 -05:00 2022"
Флаги
Флаги могут влиять на некоторые спецификации формата.
Для одного спецификатора преобразования можно указать несколько флагов; порядок не имеет значения.
Флаги заполнения
-
0— дополнять нулями:Time.new(10).strftime('%0Y') # => "0010" -
_— дополнять пробелами:Time.new(10).strftime('%_Y') # => " 10" -
-— не дополнять:Time.new(10).strftime('%-Y') # => "10"
Флаги регистра
-
^— преобразовать результат в верхний регистр:Time.new(2022, 1).strftime('%B') # => "January" # No casing flag. Time.new(2022, 1).strftime('%^B') # => "JANUARY" -
#— изменить регистр результата на противоположный:Time.now.strftime('%p') # => "AM" Time.now.strftime('%^p') # => "AM" Time.now.strftime('%#p') # => "am"
Флаги часового пояса
-
:— выводить часовой пояс в виде часов и минут, разделённых двоеточием:Time.now.strftime('%:z') # => "-05:00" -
::— выводить часовой пояс в виде часов, минут и секунд, разделённых двоеточием:Time.now.strftime('%::z') # => "-05:00:00"
Спецификаторы ширины
Целочисленный спецификатор ширины задаёт минимальную ширину возвращаемой строки:
Time.new(2002).strftime('%Y') # => "2002" # No width specifier.
Time.new(2002).strftime('%10Y') # => "0000002002"
Time.new(2002, 12).strftime('%B') # => "December" # No width specifier.
Time.new(2002, 12).strftime('%10B') # => " December"
Time.new(2002, 12).strftime('%3B') # => "December" # Ignored if too small.
Специализированные строки формата
Ниже приведены несколько специализированных строк формата, каждая из которых основана на внешнем стандарте.
Формат HTTP
Формат даты HTTP основан на RFC 2616 и представляет даты в формате '%a, %d %b %Y %T GMT':
d = Date.new(2001, 2, 3) # => #<Date: 2001-02-03>
# Return HTTP-formatted string.
httpdate = d.httpdate # => "Sat, 03 Feb 2001 00:00:00 GMT"
# Return new date parsed from HTTP-formatted string.
Date.httpdate(httpdate) # => #<Date: 2001-02-03>
# Return hash parsed from HTTP-formatted string.
Date._httpdate(httpdate)
# => {:wday=>6, :mday=>3, :mon=>2, :year=>2001, :hour=>0, :min=>0, :sec=>0, :zone=>"GMT", :offset=>0}
Формат RFC 3339
Формат даты RFC 3339 основан на RFC 3339:
d = Date.new(2001, 2, 3) # => #<Date: 2001-02-03>
# Return 3339-formatted string.
rfc3339 = d.rfc3339 # => "2001-02-03T00:00:00+00:00"
# Return new date parsed from 3339-formatted string.
Date.rfc3339(rfc3339) # => #<Date: 2001-02-03>
# Return hash parsed from 3339-formatted string.
Date._rfc3339(rfc3339)
# => {:year=>2001, :mon=>2, :mday=>3, :hour=>0, :min=>0, :sec=>0, :zone=>"+00:00", :offset=>0}
Формат RFC 2822
Формат даты RFC 2822 основан на RFC 2822 и представляет даты в формате '%a, %-d %b %Y %T %z']:
d = Date.new(2001, 2, 3) # => #<Date: 2001-02-03>
# Return 2822-formatted string.
rfc2822 = d.rfc2822 # => "Sat, 3 Feb 2001 00:00:00 +0000"
# Return new date parsed from 2822-formatted string.
Date.rfc2822(rfc2822) # => #<Date: 2001-02-03>
# Return hash parsed from 2822-formatted string.
Date._rfc2822(rfc2822)
# => {:wday=>6, :mday=>3, :mon=>2, :year=>2001, :hour=>0, :min=>0, :sec=>0, :zone=>"+0000", :offset=>0}
Формат JIS X 0301
Формат JIS X 0301 включает название японской эры и представляет даты в формате '%Y-%m-%d' с добавлением в начало первой буквы романизированного названия эры:
d = Date.new(2001, 2, 3) # => #<Date: 2001-02-03>
# Return 0301-formatted string.
jisx0301 = d.jisx0301 # => "H13.02.03"
# Return new date parsed from 0301-formatted string.
Date.jisx0301(jisx0301) # => #<Date: 2001-02-03>
# Return hash parsed from 0301-formatted string.
Date._jisx0301(jisx0301) # => {:year=>2001, :mon=>2, :mday=>3}
Спецификации формата ISO 8601
В этом разделе представлены спецификации формата, совместимые с ISO 8601. Подробную информацию о различных форматах можно найти по ссылкам.
В примерах этого раздела предполагается следующее:
t = Time.now # => 2022-06-29 16:49:25.465246 -0500
Даты
См. даты ISO 8601.
-
Годы:
-
Базовый формат года (
YYYY):t.strftime('%Y') # => "2022" -
Расширенный формат года (
±YYYYY):t.strftime('+%5Y') # => "+02022" t.strftime('-%5Y') # => "-02022"
-
-
-
Базовый формат даты (
YYYYMMDD):t.strftime('%Y%m%d') # => "20220629" -
Расширенный формат даты (
YYYY-MM-DD):t.strftime('%Y-%m-%d') # => "2022-06-29" -
Сокращённый расширенный формат даты (
YYYY-MM):t.strftime('%Y-%m') # => "2022-06"
-
-
-
Базовый формат даты (
YYYYWwwилиYYYYWwwD):t.strftime('%Y%Ww') # => "202226w" t.strftime('%Y%Ww%u') # => "202226w3" -
Расширенный формат даты (
YYYY-Wwwили <tt>YYYY-Www-D<tt>):t.strftime('%Y-%Ww') # => "2022-26w" t.strftime('%Y-%Ww-%u') # => "2022-26w-3"
-
-
-
Базовый формат даты (
YYYYDDD):t.strftime('%Y%j') # => "2022180" -
Расширенный формат даты (
YYYY-DDD):t.strftime('%Y-%j') # => "2022-180"
-
Время
-
Время:
-
Базовый формат времени (
Thhmmss.sss,Thhmmss,ThhmmилиThh):t.strftime('T%H%M%S.%L') # => "T164925.465" t.strftime('T%H%M%S') # => "T164925" t.strftime('T%H%M') # => "T1649" t.strftime('T%H') # => "T16" -
Расширенный формат времени (
Thh:mm:ss.sss,Thh:mm:ssилиThh:mm):t.strftime('T%H:%M:%S.%L') # => "T16:49:25.465" t.strftime('T%H:%M:%S') # => "T16:49:25" t.strftime('T%H:%M') # => "T16:49"
-
-
-
Часовой пояс (
timeобозначает корректное время,hh— корректное двузначное значение часа, аmm— корректное двузначное значение минуты):-
Базовый формат часового пояса (
time±hhmm,time±hhилиtimeZ):t.strftime('T%H%M%S%z') # => "T164925-0500" t.strftime('T%H%M%S%z').slice(0..-3) # => "T164925-05" t.strftime('T%H%M%SZ') # => "T164925Z" -
Расширенный формат часового пояса (
time±hh:mm):t.strftime('T%H:%M:%S%z') # => "T16:49:25-0500"
-
-
См. также:
-
Объединённые дата и время
См. представления объединённых даты и времени в ISO 8601.
Представление объединённых даты и времени ISO 8601 может состоять из любой даты ISO 8601 и любого времени ISO 8601, разделённых буквой T.
Соответствующие форматы strftime см. выше в разделах «Даты» и «Время».
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.