http://guides.rubyonrails.org/i18n.html#adding-date-time-formats のドキュメントによると、日付の特定の形式を要求する最良の方法は、/でそれらを定義することです。 config/locales /en.yml。このファイルをコピーして貼り付けました: https://github.com/Rails/rails/blob/master/activesupport/lib/active_support/locale/en.yml ロケールディレクトリに。
いくつか変更を加えました(強調のためのアスタリスクのみ):
"en-US":
date:
formats:
default: "%Y-%m-%d"
**short: "short %b %d"**
そして
time:
formats:
default: "%a, %d %b %Y %H:%M:%S %z "
**short: "short %B %d, %Y"**
そして私の部分では:
<%= l item.create_date, :format => :short %>
ここで、create_dateは、アイテムのデータベースの日時行です。
サーバーを再起動しましたが、次のような形式の日付が表示されます:15 Mar 00:00
日付も時刻も使っていないからだと感じています。日時の「短い」または「長い」の定義が見つかりません。このコードを追加して、このファイルに追加してみました。
datetime:
formats:
short: "short %B %d, %Y"
運がない。私は何が欠けています。指示に直接従っているような気がします。ありがとう!
[数年後...]
DRY日付形式を更新したい場合、および/またはto_s
のレガシーコードがいたるところにあり、アプリを国際化する予定がない場合は、次のようにすることができます。
I18n.t('date.formats').each do |key, value|
Date::DATE_FORMATS[key] = value
end
次に、config/locales/en.yml
でフォーマットを定義します。もちろん、アプリの翻訳を計画している場合は、以下に示すto_s
メソッドを使用するために、I18n.l
のすべての出現箇所を変更する必要があります。
Railsなしでこれを使用することもできます。上記のコードの前に以下を追加するだけです。
require 'active_support/time'
I18n.load_path << 'en.yml'
[数ヶ月後...]
問題は、en.ymlで「datetime」形式を定義しようとしているのに、Railsローカリゼーションコードは「date」または「time」のみをチェックする(「datetime」をまとめて「時間」付き)。
問題のあるコードは、i18nベースコード ここ の53行目にあります。
type = object.respond_to?(:sec) ? 'time' : 'date'
指定されたオブジェクトが「sec」に応答できるかどうかをチェックします。もしそうなら、それはen.ymlの「時間」のものを読みます、そうでなければ、それは「日付」フォーマットを読みます。 「日時」はありません。
Tyraelが示唆したように、初期化コードを介して、銃を突きつけて意志に従うように強制することができます。それは確かに機能しますが、これでローカリゼーションコードをイニシャライザーに配置しました。それは潜在的に混乱し、厄介です、IMO。
IMO、これを行うためのよりクリーンな方法は、次のように別の「フォーマット」を指定することにより、DateTimeに必要なフォーマットをen.ymlの「time」セクションに追加することです。
en:
time:
formats:
short_datetime: %B %d, %Y
long_datetime: %B %d, %Y, at %r
hammer_datetime: STOP! %B %d, %Y, is HAMMERTIME!
# and so on... da dum... da dum...
あなたはこのように使うことができます:
<%= l item.create_date, :format => :short_datetime %>
それが私自身が使っているアプローチです。
しかし、完全を期すために、これを行うこともできます。
en:
datetime:
formats:
default: %B %d, %Y
そして、次のようにRails読み方を教えてください:
# In your Application Helper
def localize_datetime(dt)
# quick-and-dirty demo... doesn't accept different format options and stuff...
dt.strftime(I18n.t(:"datetime.formats.default", {:locale => I18n.locale }))
end
def ld(dt)
localize_datetime(dt)
end
# or something like that...
次に、次のように使用します。
<%= ld item.create_date %>
これにより、ローカリゼーションファイルにローカリゼーション情報が保持されますが、手を汚す必要があり(上記のコードはエラーチェックを行わず、パラメーターを受け入れないなど)、出力に別の関数を使用する必要があります。 (「l」だけでなく、痛々しいほど長い「ld」)。
最後に(そしておそらく少なくとも)、Rails gnomesにその関数を修正して、「datetime」を許可するように指示することができます。:)
それがお役に立てば幸いです。幸運を祈ります。
ここでの問題はRailsのI18n:l関数にあると思います。これで試してください:
Config/environment.rbなどの初期化ファイルの1つに、以下の行を追加します。
DateTime :: DATE_FORMATS [:short] = "short%Y-%m-%d%H:%M:%S"
Time :: DATE_FORMATS [:short] = "short%Y-%m-%d%H:%M:%S"
Date :: DATE_FORMATS [:short] = "short%Y-%m-%d"
ビューの変更:
<%= item.create_date.to_s(:short)%>
出力が「短いもの」に変化するのがわかります。
私はそれが完璧な答えではないことを知っていますが、それがあなたにいくつかのヒントを与えることを願っています(私はI18n :: l関数をチェックする時間がありませんでした)。
アクティブレコードで使用する場合は、以下の例のように、文字列datetime
値をdate
オブジェクトに変換するだけであることを明確にしておきます。
_en:
date:
formats:
default: "%Y-%m-%d"
short: "%b %d"
long: "%B %d, %Y"
_
<%= l(post.the_created_at.to_date, format: :long) %>