Ngày định dạng đường ray


126

Tôi đang đăng một ngày lên API và định dạng bắt buộc như sau:

2014-12-01T01:29:18

Tôi có thể lấy ngày từ mô hình như vậy:

Model.created_at.to_s

Điều đó trả về:

2014-12-01 01:29:18 -0500

Làm cách nào tôi có thể sử dụng Rails hoặc Ruby để định dạng nó giống như định dạng bắt buộc với T và xóa -0500?

Câu trả lời:


227

Sử dụng

Model.created_at.strftime("%FT%T")

Ở đâu,

%F - The ISO 8601 date format (%Y-%m-%d)
%T - 24-hour time (%H:%M:%S)

Sau đây là một số danh sách Datevà Timeđịnh dạng hữu ích thường được sử dụng mà bạn có thể chỉ định trong strftimephương thức:

Date (Year, Month, Day):
  %Y - Year with century (can be negative, 4 digits at least)
          -0001, 0000, 1995, 2009, 14292, etc.
  %C - year / 100 (round down.  20 in 2009)
  %y - year % 100 (00..99)

  %m - Month of the year, zero-padded (01..12)
          %_m  blank-padded ( 1..12)
          %-m  no-padded (1..12)
  %B - The full month name (``January'')
          %^B  uppercased (``JANUARY'')
  %b - The abbreviated month name (``Jan'')
          %^b  uppercased (``JAN'')
  %h - Equivalent to %b

  %d - Day of the month, zero-padded (01..31)
          %-d  no-padded (1..31)
  %e - Day of the month, blank-padded ( 1..31)

  %j - Day of the year (001..366)

Time (Hour, Minute, Second, Subsecond):
  %H - Hour of the day, 24-hour clock, zero-padded (00..23)
  %k - Hour of the day, 24-hour clock, blank-padded ( 0..23)
  %I - Hour of the day, 12-hour clock, zero-padded (01..12)
  %l - Hour of the day, 12-hour clock, blank-padded ( 1..12)
  %P - Meridian indicator, lowercase (``am'' or ``pm'')
  %p - Meridian indicator, uppercase (``AM'' or ``PM'')

  %M - Minute of the hour (00..59)

  %S - Second of the minute (00..59)

  %L - Millisecond of the second (000..999)
  %N - Fractional seconds digits, default is 9 digits (nanosecond)
          %3N  millisecond (3 digits)
          %6N  microsecond (6 digits)
          %9N  nanosecond (9 digits)
          %12N picosecond (12 digits)

Để biết danh sách đầy đủ các định dạng cho strftimephương thức, vui lòng truy cập APIDock


1
Công việc tuyệt vời !! Tôi không thể nghĩ ra cách chèn T tĩnh sẽ hoạt động, nhưng thủ thuật này hoạt động ....
— HackerKarma

Một lối tắt cho định dạng phổ biến:% D - giống như (% m /% d /% y)
— RajeshM

1
Sử dụng %Anếu bạn muốn ngày trong tuần, ví dụ "Thứ tư" hoặc %a"Thứ tư"
— joeytwiddle

71

Thử cái này:

created_at.strftime('%FT%T')

Đây là một chức năng định dạng thời gian cung cấp cho bạn một cách để trình bày chuỗi đại diện của ngày. ( http://ruby-doc.org/core-2.2.1/Time.html#method-i-strftime ).

Từ APIdock:

%Y%m%d           => 20071119                  Calendar date (basic)
%F               => 2007-11-19                Calendar date (extended)
%Y-%m            => 2007-11                   Calendar date, reduced accuracy, specific month
%Y               => 2007                      Calendar date, reduced accuracy, specific year
%C               => 20                        Calendar date, reduced accuracy, specific century
%Y%j             => 2007323                   Ordinal date (basic)
%Y-%j            => 2007-323                  Ordinal date (extended)
%GW%V%u          => 2007W471                  Week date (basic)
%G-W%V-%u        => 2007-W47-1                Week date (extended)
%GW%V            => 2007W47                   Week date, reduced accuracy, specific week (basic)
%G-W%V           => 2007-W47                  Week date, reduced accuracy, specific week (extended)
%H%M%S           => 083748                    Local time (basic)
%T               => 08:37:48                  Local time (extended)
%H%M             => 0837                      Local time, reduced accuracy, specific minute (basic)
%H:%M            => 08:37                     Local time, reduced accuracy, specific minute (extended)
%H               => 08                        Local time, reduced accuracy, specific hour
%H%M%S,%L        => 083748,000                Local time with decimal fraction, comma as decimal sign (basic)
%T,%L            => 08:37:48,000              Local time with decimal fraction, comma as decimal sign (extended)
%H%M%S.%L        => 083748.000                Local time with decimal fraction, full stop as decimal sign (basic)
%T.%L            => 08:37:48.000              Local time with decimal fraction, full stop as decimal sign (extended)
%H%M%S%z         => 083748-0600               Local time and the difference from UTC (basic)
%T%:z            => 08:37:48-06:00            Local time and the difference from UTC (extended)
%Y%m%dT%H%M%S%z  => 20071119T083748-0600      Date and time of day for calendar date (basic)
%FT%T%:z         => 2007-11-19T08:37:48-06:00 Date and time of day for calendar date (extended)
%Y%jT%H%M%S%z    => 2007323T083748-0600       Date and time of day for ordinal date (basic)
%Y-%jT%T%:z      => 2007-323T08:37:48-06:00   Date and time of day for ordinal date (extended)
%GW%V%uT%H%M%S%z => 2007W471T083748-0600      Date and time of day for week date (basic)
%G-W%V-%uT%T%:z  => 2007-W47-1T08:37:48-06:00 Date and time of day for week date (extended)
%Y%m%dT%H%M      => 20071119T0837             Calendar date and local time (basic)
%FT%R            => 2007-11-19T08:37          Calendar date and local time (extended)
%Y%jT%H%MZ       => 2007323T0837Z             Ordinal date and UTC of day (basic)
%Y-%jT%RZ        => 2007-323T08:37Z           Ordinal date and UTC of day (extended)
%GW%V%uT%H%M%z   => 2007W471T0837-0600        Week date and local time and difference from UTC (basic)
%G-W%V-%uT%R%:z  => 2007-W47-1T08:37-06:00    Week date and local time and difference from UTC (extended)

31

Tạo một trình khởi tạo cho nó:

# config/initializers/time_formats.rb

Thêm một cái gì đó như thế này vào nó:

Time::DATE_FORMATS[:custom_datetime] = "%d.%m.%Y"

Và sau đó sử dụng nó theo cách sau:

post.updated_at.to_s(:custom_datetime)

Bạn phải khởi động lại máy chủ rails để làm việc này.

Kiểm tra tài liệu để biết thêm thông tin: http://api.rubyonrails.org/v5.1/groupes/DateTime.html#method-i-to_formatted_s


1
Tôi đã phải khởi động lại máy chủ phát triển để làm việc này.
— Ali Haris

Để bổ sung này: "Thêm định dạng datetime của riêng bạn để #to_formatted_s" ( api.rubyonrails.org/classes/... )
— Giovanni Benussi

16

Vì I18n là tính năng cốt lõi của Rails bắt đầu từ phiên bản 2.2, bạn có thể sử dụng tính năng địa phương hóa của nó . Bằng cách áp dụng các strftime% đã đề cập, bạn có thể chỉ định định dạng mong muốn theo config/locales/en.yml(hoặc bất kỳ ngôn ngữ nào), trong trường hợp của bạn như sau:

time:
  formats:
    default: '%FT%T'

Hoặc nếu bạn muốn sử dụng loại định dạng này ở một vài nơi cụ thể, bạn có thể coi nó là một biến như thế này

time:
  formats:
    specific_format: '%FT%T'

Sau đó, bạn có thể sử dụng nó trong quan điểm của bạn như thế này:

l(Mode.last.created_at, format: :specific_format)  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.