Ruby on Rails에서 "Sun Oct 5th"와 같이 "th"접미사로 날짜를 어떻게 형식화합니까?


177

짧은 주중, 짧은 달, 앞에 0이없는 "th", "st", "nd"또는 "rd"접미사를 포함한 형식으로 날짜를 표시하고 싶습니다.

예를 들어,이 질문을받은 날에는 "Thu Oct 2nd"가 표시됩니다.

Ruby 1.8.7을 사용하고 있으며 Time.strftime 은이 작업을 수행하지 않는 것 같습니다. 표준 라이브러리가 있으면 선호합니다.


2
질문이나 제목에 "접미사"라는 단어를 사용하면 다른 사람이 쉽게 찾을 수 있습니다. 날짜에 대해 이야기 할 때 이것에 대한 또 다른 단어가 있는지 확실하지 않습니다.
Harley Holcombe

훌륭한 질문입니다. 나는 며칠 전에 같은 것을 생각하고 있었는데 매우 도움이되었습니다.
RichH

답변:


278

'active_support'의 서 수화 방법을 사용하십시오.

>> time = Time.new
=> Fri Oct 03 01:24:48 +0100 2008
>> time.strftime("%a %b #{time.day.ordinalize}")
=> "Fri Oct 3rd"

Ruby 2.0에서 IRB를 사용하는 경우 먼저 다음을 실행해야합니다.

require 'active_support/core_ext/integer/inflections'

15
이것은 표준 라이브러리에 없다는 점에 유의하십시오.
Chris Lloyd

97

숫자에 active_support의 서수 도우미 메소드를 사용할 수 있습니다.

>> 3.ordinalize
=> "3rd"
>> 2.ordinalize
=> "2nd"
>> 1.ordinalize
=> "1st"

30

Patrick McKenzie의 답변을 조금 더 가져 가면 config/initializers디렉토리에 date_format.rb(또는 원하는대로) 새 파일을 만들고 이것을 넣을 수 있습니다.

Time::DATE_FORMATS.merge!(
  my_date: lambda { |time| time.strftime("%a, %b #{time.day.ordinalize}") }
)

그런 다음보기 코드에서 새 날짜 형식을 지정하여 날짜를 간단히 형식화 할 수 있습니다.

My Date: <%= h some_date.to_s(:my_date) %>

간단하고 작동하며 쉽게 구축 할 수 있습니다. 다른 날짜 형식 각각에 대해 date_format.rb 파일에 더 많은 형식 줄을 추가하십시오. 좀 더 구체적인 예가 있습니다.

Time::DATE_FORMATS.merge!(
   datetime_military: '%Y-%m-%d %H:%M',
   datetime:          '%Y-%m-%d %I:%M%P',
   time:              '%I:%M%P',
   time_military:     '%H:%M%P',
   datetime_short:    '%m/%d %I:%M',
   due_date: lambda { |time| time.strftime("%a, %b #{time.day.ordinalize}") }
)

7
좋은 대답입니다. Rails 3의 경우 ActiveSupport가 상당히 변경되었으므로 다음과 같습니다.Time::DATE_FORMATS.merge!(:my_date => lambda { |time| time.strftime("%a, %b #{ActiveSupport::Inflector.ordinalize(time.day)}") })
Sidane

9
>> require 'activesupport'
=> []
>> t = Time.now
=> Thu Oct 02 17:28:37 -0700 2008
>> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}"
=> "Thu Oct 2nd"

6

나는 Bartosz의 대답이 마음에 들지만, 우리가 말하는 Rails이기 때문에 한 단계 씩 끔찍하게 생각해 봅시다. (편집 : 다음과 같은 방법으로 원숭이 패치를하려고했지만 더 깨끗한 방법이 있습니다.)

DateTime인스턴스에는 to_formatted_s단일 기호를 매개 변수로 사용하는 ActiveSupport에서 제공 하는 메소드 가 있으며 해당 기호가 유효한 사전 정의 된 형식으로 인식되면 적절한 형식의 문자열을 리턴합니다.

이러한 기호는 Time::DATE_FORMATS표준 형식화 함수 또는 procs의 문자열에 대한 기호의 해시 인에 의해 정의됩니다 . Bwahaha.

d = DateTime.now #Examples were executed on October 3rd 2008
Time::DATE_FORMATS[:weekday_month_ordinal] = 
    lambda { |time| time.strftime("%a %b #{time.day.ordinalize}") }
d.to_formatted_s :weekday_month_ordinal #Fri Oct 3rd

그러나 원숭이 패치의 기회를 막을 수 없다면 항상 깨끗한 인터페이스를 제공 할 수 있습니다.

class DateTime

  Time::DATE_FORMATS[:weekday_month_ordinal] = 
      lambda { |time| time.strftime("%a %b #{time.day.ordinalize}") }

  def to_my_special_s
    to_formatted_s :weekday_month_ordinal
  end
end

DateTime.now.to_my_special_s  #Fri Oct 3rd

3

직접 만들어 봐 %o 형식을 .

이니셜 라이저

config/initializers/srtftime.rb

module StrftimeOrdinal
  def self.included( base )
    base.class_eval do
      alias_method :old_strftime, :strftime
      def strftime( format )
        old_strftime format.gsub( "%o", day.ordinalize )
      end
    end
  end
end

[ Time, Date, DateTime ].each{ |c| c.send :include, StrftimeOrdinal }

용법

Time.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"

당신은 이것을 사용할 수 있습니다 DateDateTime뿐만 아니라 :

DateTime.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"

Date.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"

이것이 문서화되어 있는지 확실하지 않습니다. 레코드를 찾을 수 없지만 코드베이스에서 사용하므로 어딘가에 있어야합니다.
Joshua Pinter

1
2.6.3 에서이 작업을 수행 할 수 없습니다. 어쩌면 이전 버전의 Ruby에 있었습니까? 아니면 누군가 Time프로젝트에 원숭이 패치 가 있습니까?
kcdragon

2
@kcdragon 와우, 당신은 절대적으로 옳았습니다. 코드베이스를 검색 한 결과 내 오래된 친구 인 Chuck Bergeron이 7 년 전에이 초기화 프로그램을 추가 한 것을 발견했습니다. 어쨌든, 나는 여전히 이것이 매우 유용하다는 것을 알기 때문에 CNTRAL에있는 것처럼 그것을 구현하는 방법으로 답변을 업데이트했습니다.
Joshua Pinter

2

Jonathan Tran은 처음에 약식 요일을 찾고 있었다고 말했지만, 여기에 오는 사람들은 Rails가 더 많은 것을 지원한다는 사실을 아는 것이 도움이 될 것이라고 생각합니다 일반적으로 사용할 수있는 긴 달, 서 수화 된 정수, 그 뒤에 연도 June 1st, 2018 .

다음을 통해 쉽게 달성 할 수 있습니다.

Time.current.to_date.to_s(:long_ordinal)
=> "January 26th, 2019"

또는:

Date.current.to_s(:long_ordinal)
=> "January 26th, 2019"

원하는 경우 시간 인스턴스를 유지할 수 있습니다.

Time.current.to_s(:long_ordinal)
=> "January 26th, 2019 04:21"

Rails API 문서 에서 사용자 정의 형식을 만드는 방법에 대한 더 많은 형식과 컨텍스트를 찾을 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.