В Ruby on Rails, как я форматирую дату с суффиксом “th”, как в, “Sun 5-го октября”?

Теперь, когда прошло некоторое время с момента принятия первоначального ответа, есть лучший подход:

String out = new Scanner(new URL("http://www.google.com").openStream(), "UTF-8").useDelimiter("\\A").next();

Если вы хотите немного более полную реализацию, которая не является отдельной строкой, сделайте следующее:

public static String readStringFromURL(String requestURL) throws IOException
{
    try (Scanner scanner = new Scanner(new URL(requestURL).openStream(),
            StandardCharsets.UTF_8.toString()))
    {
        scanner.useDelimiter("\\A");
        return scanner.hasNext() ? scanner.next() : "";
    }
}
174
задан Alan W. Smith 9 August 2015 в 20:46
поделиться

5 ответов

Используйте ordinalize метод от 'active_support'.

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

Примечание при использовании IRB с Ruby 2.0 Вы должны первый показ:

require 'active_support/core_ext/integer/inflections'
272
ответ дан Alan W. Smith 23 November 2019 в 20:29
поделиться

Можно использовать ordinalize вспомогательный метод active_support для чисел.

>> 3.ordinalize
=> "3rd"
>> 2.ordinalize
=> "2nd"
>> 1.ordinalize
=> "1st"
94
ответ дан rogerdpack 23 November 2019 в 20:29
поделиться

Беря ответ 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}") }
)
30
ответ дан Dorian 23 November 2019 в 20:29
поделиться
>> require 'activesupport'
=> []
>> t = Time.now
=> Thu Oct 02 17:28:37 -0700 2008
>> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}"
=> "Thu Oct 2nd"
9
ответ дан Jimmy Schementi 23 November 2019 в 20:29
поделиться

Мне нравится ответ Bartosz, но эй, так как это - направляющие, о которых мы говорим, давайте возьмем его, каждый повышается в окольном. (Редактирование: Хотя я шел в просто monkeypatch следующий метод, повороты там более чистый путь.)

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

, Но эй, если Вы не можете сопротивляться возможности к monkeypatch, Вы могли бы всегда давать этому более чистый интерфейс:

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
6
ответ дан Patrick McKenzie 23 November 2019 в 20:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: