짧은 주중, 짧은 달, 앞에 0이없는 “th”, “st”, “nd”또는 “rd”접미사를 포함한 형식으로 날짜를 표시하고 싶습니다.
예를 들어,이 질문을받은 날에는 “Thu Oct 2nd”가 표시됩니다.
Ruby 1.8.7을 사용하고 있으며 Time.strftime 은이 작업을 수행하지 않는 것 같습니다. 표준 라이브러리가 있으면 선호합니다.
답변
‘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'
답변
숫자에 active_support의 서수 도우미 메소드를 사용할 수 있습니다.
>> 3.ordinalize
=> "3rd"
>> 2.ordinalize
=> "2nd"
>> 1.ordinalize
=> "1st"
답변
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}") }
)
답변
>> require 'activesupport'
=> []
>> t = Time.now
=> Thu Oct 02 17:28:37 -0700 2008
>> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}"
=> "Thu Oct 2nd"
답변
나는 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
답변
직접 만들어 봐 %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"
당신은 이것을 사용할 수 있습니다 Date
및 DateTime
뿐만 아니라 :
DateTime.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"
Date.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"
답변
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 문서 에서 사용자 정의 형식을 만드는 방법에 대한 더 많은 형식과 컨텍스트를 찾을 수 있습니다 .