Spec-Zone.ru › Ruby 3.3

Форматы дат и времени

Несколько классов Ruby, связанных со временем, имеют метод экземпляра strftime, который возвращает отформатированную строку, представляющую всю или часть даты или времени:

  • Date#strftime.

  • DateTime#strftime.

  • Time#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 представляет действительное двузначное число часов, а 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"
        
    • См. также:

      • Локальное время (неквалифицированное).

      • Координированное универсальное время (UTC).

      • Смещения времени от UTC.

Объединённые дата и время

См. 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API