Форматы дат и времени
Несколько классов 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 week dates.
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 dates.
-
Годы:
-
Базовый год (
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 times.
-
Время:
-
Базовое время (
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представляет действительный 2-значный час, аmmпредставляет действительную 2-значную минуту):-
Базовый часовой пояс (
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–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.