日期的后缀(第1,第2,第3,第4等)

时间:2013-10-13 17:03:37

标签: ruby string date format

我正在编写脚本以将IPTC数据添加到图像文件夹中。它从EXIF信息中提取日期,并将其添加到'Caption' IPTC标记中。

date = iptc["DateTimeOriginal"]
date = date.strftime('%A %e %B %Y').upcase
iptc["Caption"] = '%s: %s (%s)' % [date, caption, location]

除日期输出外,脚本可以工作:

Sunday 13 October 2013

理想情况下,我希望输出:

Sunday 13th October 2013

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:3)

如果您能够(并且愿意)将Ruby gem带入组合中,请考虑ActiveSupport::Inflector。 您可以使用

进行安装

gem install active_support

(您可能需要sudo

然后在您的文件中要求它并包含ActiveSupport::Inflector

require 'active_support/inflector' # loads the gem
include ActiveSupport::Inflector # brings methods to current namespace

那么你可以{will-nilly ordinalize整数:

ordinalize(1)  # => "1st"
ordinalize(13) # => "13th"

您可能需要手动将日期字符串化:

date = iptc["DateTimeOriginal"]
date_string = date.strftime('%A ordinalday %B %Y')
date_string.sub!(/ordinalday/, ordinalize(date.day))
date_string.upcase!

你应该在路上:

iptc["Caption"] = "#{date_string}: #{caption} #{location}"

答案 1 :(得分:3)

如果您不想要求ActiveSupport的帮助程序,也许只需复制一个执行该作业的特定方法:

# File activesupport/lib/active_support/inflector/methods.rb
def ordinalize(number)
  if (11..13).include?(number.to_i.abs % 100)
    "#{number}th"
  else
    case number.to_i.abs % 10
      when 1; "#{number}st"
      when 2; "#{number}nd"
      when 3; "#{number}rd"
      else    "#{number}th"
    end
  end
end

在脚本中使用该方法,将代码更改为:

date = date.strftime("%A #{ordinalize(date.day)} %B %Y")