Форматы дат и времени
В нескольких классах 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"
Даты по неделям
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"
-
Время
См. время ISO 8601.
-
Время:
-
Базовый формат времени (
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.