0

そのため、Time.zone を設定すると、ビューの日付から一貫性のない結果が得られます。誰かが何が起こっているのか教えてくれることを願っています。ubuntuサーバー12.04で実行されているRuby on Railsアプリを持っています

私のアプリケーション コントローラーには、current_user の会社の time_zone レコードから Time.zone を設定する before_filter があります。

before_filter :set_user_time_zone

private

def set_user_time_zone
  Time.zone = current_user.company.time_zone if user_signed_in?
end

私がテストしているユーザーは「中部時間(米国およびカナダ)」にいます

生のデータベース レコードは 2012-08-13 20:10:54 です。

私の見解では、次のコードを使用して日付をフォーマットしています。

servicedata.service_last_run_time.strftime('%b %e, %Y %l:%M%P')

「2012 年 8 月 13 日午後 8 時 10 分」を返すことを期待しますが、これは「中部時間 (米国およびカナダ)」の上記のレコードになりますが、「2012 年 8 月 13 日午前 9 時 10 分」となります。

Rails コンソールで同じコードをテストしたところ、問題なく動作しました。なぜ機能しないのかわかりません。

before_filter のアイデアを見つける前は、すべてのビューで単に「in_time_zone」をチェーンしていましたが、同じ結果が得られました。例

servicedata.service_last_run_time.in_time_zone(current_user.company.time_zone).strftime('%b %e, %Y %l:%M%P') 

ここでも、Time.zone または in_time_zone を日付オブジェクトに手動でチェーンすることは両方とも、Rails コンソールでは正常に機能しましたが、ビューでは恐ろしい間違った時刻が返されます。

サーバーが次の UTC から変更されていないことを確認する時間であることをテストしました。

Rails Console : 2012-08-14 02:06:29 +0000
Ubuntu Shell: Tue Aug 14 02:06:38 UTC 2012

ここで何が欠けているのかわかりません。

4

2 に答える 2

0

I18n.localize を使用したい場合 - http://guides.rubyonrails.org/i18n.html、具体的には http://guides.rubyonrails.org/i18n.html#adding-date-time-formats を参照してください。

config/locals/en.yml には、使用できる組み込みフォーマットがすでにいくつかあり、独自のフォーマットを追加することもできるので、次のことができます。

<%= I18n.localize(servicedata.service_last_run_time, :format => :long) %>

構成に独自のものを追加できます。フォーマット arg で新しく定義されたキーを使用するだけです

<%= I18n.localize(servicedata.service_last_run_time, :format => :my_super_special_format) %>

この4つの異なる方法を書くことができることに注意してください.Railsビューにいるときはすべて同じです.

<%= I18n.localize(servicedata.service_last_run_time, :format => :long) %>
<%= I18n.l(servicedata.service_last_run_time, :format => :long) %>
<%= localize(servicedata.service_last_run_time, :format => :long) %>
<%= l(servicedata.service_last_run_time, :format => :long) %>

datetime 値が nil の場合、例外がスローされます (残念ながら)。nil が有効な場合は、いくつかの条件を追加します。

<%= localize(servicedata.service_last_run_time, :format => :long) if servicedata.service_last_run_time %>
于 2012-08-14T03:31:56.967 に答える
0

そして、私は何が間違っていたのかを理解しました。time_zone で日付を表示するのは私の方法ではありませんでした

私が表示しようとしていたレコードは、コンピューターのレポートからのものであり、そのコンピューターがマシンの現在のタイムゾーンを取得することを報告したとき、私にはわかりませんでした。

だから私はすでに中央に時間をかけて、もう一度変換しようとしていました. おっとっと。

于 2012-08-14T15:45:35.393 に答える