6

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から「フォールバック」したと私は信じています。これにより、私が見ている不一致が発生します。

私はこれを可能な限り単純化しようとしましたが、まだかなりの数のギアが動いています。

  1. これは、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に基づいています。

  1. 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

WindowsOSXでは問題がないように見えることを強調するためにタグを追加しました。

更新:上記のリンク先のサイトによると、2006年の回答が1週間ずれていたのとは異なり、次のすべての日付が適切な日付の新しいGMTオフセットに交差することを確認しました(更新されたフィドル) 。つまり、2007年11月4日でしたが、2007年11月5日で戻ってきました。GMT-4GMT-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が依存しているタイムゾーンソースにこのエラーを送信するための適切なチャネルを知っている場合は、そうして、私に知らせてください。

4

2 に答える 2

7

まず、インディアナでの時間は非常に複雑です。

しかし、この場合、Javascriptは間違っていると思います。私のマシン(タイムゾーンを設定)でのJavascriptの出力は、Chromeでは「Wed Nov 01 2006 00:00:00 GMT-0400(Eastern Daylight Time)」、「Wed Nov 100:00:00EDT2006」です。 Internet Explorerで-しかし、夏時間は2006年10月29日にインディアナポリスで終了しました

.NETのTimeZoneInfoクラスでも同じ結果が得られます。

// Ignore the daft ID; it really means Eastern time
var zone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var local = new DateTime(2006, 11, 1);
Console.WriteLine(zone.GetUtcOffset(local));

出力:

-5:00:00

(つまり、夏時間ではないことがわかります。)

同様に、Noda Time(tzdbデータベースを使用する私自身の日付と時刻のライブラリ)では、次のようになります。

var zone = DateTimeZone.ForId("America/Indiana/Indianapolis");
var instant = new Instant(1162357200 * NodaConstants.TicksPerSecond);
var zoned = new ZonedDateTime(instant, zone);
Console.WriteLine(zoned);

結果:

Local: 01/11/2006 00:00:00 Offset: -05 Zone: America/Indiana/Indianapolis
于 2012-05-09T18:52:24.940 に答える
0

ふぅ; Jonには、2006年11月の初めの数週間に夏時間が始まったとき(少なくともインディアナ州では)、JavascriptがWindowsマシンで間違ったデータベースをプルしているといういくつかの優れた点と確認があると思います。

Javascript内でこのジレンマを解決する方法をまだ正確に知りません。ただし、私の主な問題はJavascriptとPHPの「不一致」であったため(結局、同じ日/同じ時間にDSTに変更された場合、問題があることに気付くことはありませんでした)、おそらく解決策です。どちらかに依存するのをやめます。

このSOの回答は、unixtimeを取得していませんが、unixtimeに依存し続ける必要がある場合に、この緊張を解決する方法を示しています。それは実際にはかなり巧妙な解決策です、私見。簡単な要約:AJAXを介してタイムゾーン情報を取得します。これは、PHPが本質的に値自体を提供するため、特定の日の00:00:00のUNIX時間について常に同意することを意味します。

ただし、これはまだ問題の実際の解決策のようには感じられません。Javascriptは、東部標準時が夏時間を終了したときの誤った理解を取得しています。この非常に小さくて狭い不整合のウィンドウを修正する方法を知っていただければ幸いです。

私がJavascriptで正しい値を出力することを試みたOSXマシン以来、それは「おそらくまだ開発されていない」Windowsパッチのように複雑でさえあり得ますか?

私のシナリオとこの質問が関連しているとは思えませんが、調査中に遭遇したのは魅力的なバグです。その質問では、Dateオブジェクトは、渡された形式によっては、非常に驚​​くべき出力を生成する可能性があります。

誰かが適切な日付を計算するためにユーザーのコンピューターのタイムゾーンデータベースへの依存を覆したい場合、この回答は、自分のタイムゾーンデータベースを作成して信頼するのに役立つ可能性があります。私はその種のソリューションでの作業や、Javascriptによって返されるunixtimeの結果をオーバーライドする方法については調査していませんが、それが私が見つけた最も近い答えです。オーバーヘッドはどうなるのだろうか...?このタイプのソリューションを実装できる場合は、必ず回答を投稿してください。これが、私の元の質問に対する真の回答になる可能性があります。

于 2012-05-10T12:19:46.000 に答える