19

タイムゾーンとDSTの問題に関する100万の質問に追加するだけです。

日付と時刻のフィールドが別々になっているフォームがあり、それらを組み合わせてDateTimeを作成します。

start_time = DateTime.parse("#{parse_date(form_date)} #{form_start_time} #{Time.zone}")

2012年8月21日と15:00でフォームに入力すると、これらはフォームをリロードしたときに表示される値です。次に、モデルのstart_time属性を見ると、正しく設定されていTue, 21 Aug 2012 15:00:00 EST +10:00ます。

私が抱えている問題は、夏時間が始まると今年後半に日付を使用すると発生します(私はオーストラリアにいます)。2012年12月21日と15:00を使用する場合は、start_timeを確認してくださいFri, 21 Dec 2012 16:00:00 EST +11:00

この問題の私の解釈は、日付が現在のタイムゾーン(+10:00)に保存されているということです。これは、DateTime.parseに指示したことです。ただし、値が返されると、Railsは日付を確認し、「ねえ、12月の夏時間です」と言って、+11:00タイムゾーンで時刻を返します。

私がやりたいのは、DSTが有効になっている場合、+11:00タイムゾーンで時間を節約するようにDateTime.parseに指示することです。明らかにTime.zoneを文字列に渡しても、これは達成されません。これを行う簡単な方法はありますか?Time#dstを使用してそれを行う方法を見ることができますか?しかし、これによって本当に醜い複雑なコードが作成されるのではないかと思います。私が欠けている方法が組み込まれているのではないかと思いました。

4

6 に答える 6

12

これまでの私の解決策は次のとおりです。誰かがもっと良いものを持っていることを願っています。

start_time = DateTime.parse "#{date} #{(form_start_time || start_time)} #{Time.zone}"
start_time = start_time - 1.hour if start_time.dst? && !Time.now.dst?
start_time = start_time + 1.hour if Time.now.dst? && start_time.dst?

動作するようですが、厳密にテストしていません。きれいにして短くすることができると思いますが、これは読みやすく、理解しやすいと思います。改善点はありますか?

于 2012-08-22T02:28:32.410 に答える
2

私はこの正確な問題に遭遇しました。私のアプリでは、ユーザーが今後のイベントを見ることができます。米国では 11 月 2 日に DST が終了し、その日以降のすべてのイベントは 1 時間早く表示されていました。

タイムゾーンを選択して独自のフィールドに保存する機会が必要です。以下を使用して日時を保存する前:

timezone_offset = Time.now.in_time_zone(params[:opportunity][:time_zone]).strftime("%z") #-0700
DateTime.parse("#{params[:opportunity][:start_datetime]} #{timezone_offset}")

問題を修正するには、次のように変更しました。

start_datetime = Time.zone.parse(params[:opportunity][:start_datetime])

正しい時刻を表示するには、次を使用します。

@opportunity.start_datetime.in_time_zone(@opportunity.time_zone)
于 2014-10-02T06:23:41.770 に答える
0

Rails では、これに ActiveSupport::TimeZone を使用できます。

tz = ActiveSupport::TimeZone.new 'Pacific Time (US & Canada)'
tz.parse(date_str_without_zone).to_datetime

私はTZipを使用して、郵便番号から TimeZone 文字列 (例: "Pacific Time (US & Canada)") を取得しています。

于 2014-09-17T21:54:10.953 に答える
0

私は試してみます

Australian Eastern Standard Time (AEST) (UTC +10).  
Australian Central Standard Time (ACST) (UTC +9 ½).  
Australian Western Standard Time (AWST) (UTC +8).  

夏時間に合わせて調整します。

于 2012-08-22T03:11:32.893 に答える
0

でサポートされているものとは異なるカスタムの日付/時刻形式がある場合は、次のString#in_time_zoneように使用することもできます (Rails 5 以降) strptime:

Time.find_zone!('Auckland').strptime('2021-02-02 08.00.00', '%Y-%m-%d %H.%M.%S')
于 2021-03-18T00:31:07.737 に答える