new Date()
夏時間のタイムラインに関しては、JavaScriptオブジェクトに関するStackOverflowの質問をたくさん読んだことがあります。しかし、私はこの特定の問題についての答えや、 「UNIX時間」に依存しながらそれを回避する方法を見たことがありません。
私は個人的に、この問題を回避するために、UNIX時間ではなくjavascriptの日付を日付としてPHPコードに渡すことを選択しました。それでも、しつこい質問はまだ残っています!IE8、Chrome、FFでこの動作を確認したので、同じように動作すると思います。(更新: OSXユーザーはこの動作を生成できない可能性があります)
私の研究; 私の問題に最も近い質問:
- このユーザーは、DSTの変更の前後の特定の時間に取り組んでいました。
- このユーザーは、ユーザーのタイムゾーンによっては時間の表示が気になりました。そのページで受け入れられた答えは、それ
getTimezoneOffset
が「不安定」であると述べていたので、私はそれを掘り下げませんでした。 - いくつかの素晴らしい洞察を持っている他の質問については、以下の私の答えを参照してください
2006年11月1日頃にテストシナリオを生成しました。これは、現在のタイムゾーンによっては同じように機能する場合と機能しない場合があります。JavaScriptの側面を正しく理解している場合は、PCの時計を次のように同期する必要があります。
東部標準時(米国およびカナダ)で、「夏時間の時計を自動的に調整する」を確認します。
この実験は、PHPの「インディアナポリス」タイムゾーンに基づいています。2006年11月1日のUNIX時間を見つけたときのJavaScriptの結果は、PHPが生成する時間(3600秒)から1時間ずれています。このページによると(ありがとうジョン!)javascriptは間違っています。
2つの言語の結果は、2006年11月6日に合意に戻ります。
この調査やその他の調査により、Javascriptの履歴が間違っていて、間違った日曜日を選択してDSTから「フォールバック」したと私は信じています。これにより、私が見ている不一致が発生します。
私はこれを可能な限り単純化しようとしましたが、まだかなりの数のギアが動いています。
これは、2006年11月1日までの正しいミリ秒数を示すPHPコードと出力です。
date_default_timezone_set( "アメリカ/インディアナ/インディアナポリス"); echo "2006年11月1日のUnixtimeは次のとおりです:"。strtotime( "11/01/2006")。 "\ n"; echo "2006年11月6日のUnixtimeは次のとおりです:"。strtotime( "11/06/2006");
結果は次のとおりです。
Unixtime for November 1, 2006 is: 1162357200 (where the disagreement lies)
Unixtime for November 6, 2006 is: 1162789200
どちらもGMT-0500に基づいています。
Javascriptでは(私のjsfiddle **を参照)、私は
new Date
それを呼び出してから、getTime()
そのように呼び出します(そしてミリ秒を削除します):new Date( "2006/11/01")。getTime()/ 1000 new Date( "2006/11/06")。getTime()/ 1000
これにより値が生成されます
1162353600 <-- PHP outputs: 1162357200
1162789200 <-- the same as PHP for '2006/11/06'; congruence is restored
これは、PHPを介した3600秒(または1時間)の出力との違い(2006/11/01の場合)です。この値(1時間前)をPHPアプリケーションで処理すると、前日(2006/10/31)が生成されましたが、ナビゲーションが中断されたため、受け入れられませんでした。(私の特定のシナリオの詳細な説明を参照してください)
Javascriptでの出力:javascriptは使用していたオフセットを明らかにするため、Date("2006/11/01")
呼び出さずに謎の一部を明らかにします。getTime()
GMT-0400
私のjsfiddle **実験(上記にもリストされています)は、これらの結果を示しています。
**(同じ動作を確認するには、コンピューターのタイムゾーンを変更する必要がある場合があります)。
おそらく、ウィキペディアによると、2006年はインディアナがDSTを使い始めた最初の年でした。どちらにしても奇妙なパズル。
私はすでに(javascriptでUNIX時間に依存することを避けて)解決策を考え出したので、後世のためにこれを投稿する必要があると思いました。うまくいけば、誰かがjavascriptが示している値を修正する方法を知っているかもしれません。
問題はこれです: PHPとjavascriptの間の2つの「unixtime」の結果をどのように整列させるのですか?DSTの「ライン」または一般的な方法を知っていただければ幸いです。(現在、DSTラインが問題であると想定しています)。
更新: Chromeを実行しているiMacは、PHPが生成している結果を生成しました。何???野生。この動作に対するjavascript側の修正は、すばらしい作業(または少なくとも醜い)になるように見えます。OS(または他の要因?)に応じて正しい答えが生成されるため、おそらくこれはjavascriptの問題ではありません。
特に、このiMacではタイムゾーンを強制しなかったため、このAppleコンピュータでタイムゾーンが許可されるかどうかはわかりません。「日付と時刻を自動的に設定する」の設定にチェックを入れました(true
)とdisabled
。タイムゾーンは東部夏時間に設定されました。[タイムゾーンを自動的に設定する]チェックボックスがオフになっています(false
)およびdisabled
。
Windows
OSXでは問題がないように見えることを強調するためにタグを追加しました。
更新:上記のリンク先のサイトによると、2006年の回答が1週間ずれていたのとは異なり、次のすべての日付が適切な日付の新しいGMTオフセットに交差することを確認しました(更新されたフィドル) 。つまり、2007年11月4日でしたが、2007年11月5日で戻ってきました。GMT-4
GMT-5
- 2007年3月11日日曜日午前2時11月4日日曜日午前2時
- 2008年3月9日日曜日午前2時11月2日日曜日午前2時
- 2009年3月8日日曜日午前2時11月1日日曜日午前2時
- 2010年3月14日日曜日午前2時11月7日日曜日午前2時
- 2011年3月13日日曜日午前2時11月6日日曜日午前2時
最後に、2006年にJavascriptが依存しているタイムゾーンソースにこのエラーを送信するための適切なチャネルを知っている場合は、そうして、私に知らせてください。