3

私は、ユーザーが日付に基づいてコンテンツを取得できるようにする非常に小さな JavaScript ライブラリに取り組んでいます。このコンテンツでは、日付は単なる識別子であり、タイムゾーンはまったく関係ありません (ディルバート フリップ カレンダーの方針に沿って考えてください)。「5月14日」の内容はアメリカでもオーストラリアでも同じです。

データを取得する関数は現在、Date オブジェクトをパラメーターとして受け取ります。関数内では、タイムゾーンは無視されます。このアプローチは理にかなっていますか、それともタイムゾーンに依存しない識別子 ( 2012-01-01など) をパラメーターとして使用する方がよいでしょうか? Date オブジェクトのアプローチでは、ブラウザーがタイムゾーンを調整した結果、間違ったデータを返すリスクがありますか?

4

3 に答える 3

2

Date.getUTC*() 関数を使用するのはどうですか? UTC 時間は誰にとっても同じです。

于 2013-04-27T22:15:42.823 に答える
1

いくつかの調査を行った後、タイムゾーン情報を単純に無視することが最善の方法であるようです。なんで?これにより、Date コンストラクター (これが私の目標です) に提供された日付と時刻が常に保持されますが、getUTC* メソッドは日付と時刻の変更されたバージョンを返します。たとえば、東部標準時ゾーンのコンピューターで実行したこのノードREPLセッションを見てください。

> d = 新しい日付(2013, 03, 27, 23, 00, 00)
2013 年 4 月 27 日土曜日 23:00:00 GMT-0400 (EDT)
> d.getDate() // コンストラクターで提供された同じ日付。ウー!
27
> d.getUTCDate() // 別の日付。ブー!
28

簡単に言うと、Date コンストラクターで提供された正確な日付と時刻を読み取りたい場合は、通常の get* メソッド (getDate など) を使用してそれを行います。getUTC* メソッド (getUTCDate など) を使用すると、日付と時刻の変更されたバージョンが返されます。

経験豊富なプログラマーにとって、これは初歩的なことのように聞こえるかもしれませんが、これは物事を理解するのに本当に役立ちました。一緒に来る他の人に役立つことを願っています。

于 2013-04-28T02:51:16.220 に答える
1

あなた自身の答えのアプローチの唯一の問題は、あいまいな時間を考慮していないことです。これは、夏時間のフォールバック移行中に発生します。

たとえば、コンピューターのタイム ゾーンを米国山岳時間 (Windows では「山岳時間 (米国およびカナダ)」、Mac/Linux では「アメリカ/デンバー」) に設定します。次にブラウザを再起動し、次の JavaScript を実行します。

var dt = new Date(2013,10,3,1,0);
alert(dt);

これは 2013 年 11 月 3 日午前 1 時です。しかし、それがどの午前 1:00 を表しているかはわかりません。移行前は山岳夏時間 (UTC-6) ですか、それとも移行後は山岳標準時 (UTC-7) ですか? 判断する方法はなく、JavaScript は標準時間を使用するだけです。

あなたが必要とするのは今2013-11-03 01:00、あなたは正しいです。オフセットを無視して、それで完了できます。しかし、ある時点を記録したり、それらの間の期間を別の時点から差し引いたりするなど、意味のあることにその値を使用する場合は、オフセットなしでは解決できない問題があります。

残念ながら、JavaScript でこの問題を解決する優れた方法はありません。最も近いのはMoment.jsですが、まだ完全ではありません。それでも、Dateブラウザの不一致を回避し、より優れた解析と書式設定を提供するため、オブジェクト自体よりも優れています。

于 2013-04-28T21:03:29.497 に答える