1

私は、Rails で Time を操作しようとして、髪を伸ばしてきました。基本的に、すべての時間出力 (コアと ActiveSupport) をサーバーのローカル時間に設定する必要があります。GMT や UTC などはありません。時間に関連するさまざまな投稿を見てきましたが、通常は誰かが設定する必要があります。各ユーザー。私の場合はそれほど複雑ではありません。Time オブジェクトを使用するときに一貫性が必要なだけです。(Fixnum (またはその他の型) を文字列に変換できないというエラーが 3 秒ごとに表示されないこともありがたいです。これは Ruby です。実行してください!)

また、Time.new と ActiveSupport 1.second.ago の時間が大幅に異なるようです。とにかく、Rails で Time を使用することに関して、質の高い提案はありますか?

4

5 に答える 5

1

Time オブジェクトに一貫性を持たせたいだけなら、なぜ UTC に固執しないのでしょうか? スクリプト/コンソールを試しTime.newてみたところ1.second.ago、同じ出力が得られました(コマンドを入力するのに少し時間がかかります)。いかがですか?

于 2009-07-15T19:21:44.013 に答える
1

イニシャライザのどこかで、使用するフォーマットを定義します。

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(:default => '%m/%d/%Y %H:%M')
ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(:my_special_format => '%H:%M %p')

次に、Time オブジェクトを出力する場合は、次の例のように機能します。コンソールの Time オブジェクトは、既に私のタイム ゾーンを認識していることに注意してください。ここでは、魔法の変換を実行していません。

>> t = Time.now
=> Wed Jul 15 18:47:33 -0500 2009
>> t.to_s
=> "07/15/2009 18:47"
>> t.to_s(:my_special_format)
=> "18:47 PM"

Time#to_s の呼び出しでは :default 形式を使用します。または、:my_special_format で行ったように、使用したい形式の名前を渡すこともできます。

Time オブジェクトをフォーマットするためのさまざまなオプションについては、こちらを参照してください

于 2009-07-15T23:40:50.103 に答える
0

config/environment.rbRailsのコンテキスト内で常に正しく一貫して時間を処理するには、に以下を追加します。UTCでデータベースに時刻が保存されることを知っておくことが重要ですが、これが必要なことです。すべての変換は自動的に行われます。

config.time_zone = 'Pacific Time (US & Canada)'

rake time:zones:localRailsルートディレクトリから実行して、お住まいの地域で有効なタイムゾーン文字列のリストを取得できます。

于 2009-12-07T06:32:19.733 に答える
0

各ユーザーの時間設定を保存したくない場合、唯一の解決策は、ユーザーのクライアント時間で機能するため、javascript 時間システムを使用することです。たとえば、ユーザーが試行するたびに、アプリは各データの初期日付値が「今日」のサンプルデータを作成するアプリケーションを持っています。私のホストサーバーはオーストラリアにあり、多くのユーザーが西部にいるため、最初は混乱します。そのため、最初の日付の値が「今日」ではなく、時間地域が異なるために「昨日」と表示されることがあります。

数日間の頭痛の種の後、私は最終的にJavaScriptの時間システムを使用してリンクに含めることを決定したので、ユーザーが「今すぐ試す」リンクをクリックすると、今日の日付の値も含まれます。

<% javascript_tag do -%>
  var today = new Date();
  $("trynow").href = "<%= new_invitation_path %>?today=" + today.toLocaleString();
<% end -%>
于 2009-07-16T07:44:47.183 に答える
0

上記の DATE_FORMAT ソリューションへの簡単な追加。形式は文字列にすることができます。その場合、strftime を呼び出すことで上記のように機能しますが、形式をラムダとして定義することもできます。

CoreExtensions::Time::Conversions::DATE_FORMATS.merge! :my_complex_format => lambda {|time|
   # your code goes here
}
于 2011-01-04T20:38:57.447 に答える