14

米国カリフォルニア州のユーザーが日付、時刻、タイムゾーンを選択するとします。

ワールドワイド ビール マラソンは2013 年8 月 15 日午前 10:00、UTC-08:00 に始まります

中央ヨーロッパの別のユーザーが、この日付と時刻が表示されているページを開きます。彼は時間の計算をしたくありません (すでにビールをほとんど飲んでいません)。彼は次の日付と時刻を確認したいだけです。

2013/8/15 19:00

ブラウザがカリフォルニアのユーザーによって入力された日付と時刻の情報を受け取ったとします。

javascriptで、外部 Web サービスを使用せずに正しい変換を行う方法はありますか? つまり、夏時間であるため、午前 10 時 UTC-08:00 が実際には午前 10 時 UTC-07:00 であることを検出します。

最初の認識が間違っていたのかもしれませんが、UTC-08:00 (PST) と UTC-07:00 (PDT) のどちらを選ぶべきか、入力ユーザーに考えさせたくありません。カリフォルニア州の標準時間帯は PST であるため、夏時間に PDT で考えることに切り替える人はいないのではないでしょうか。それとも彼らですか?

中央ヨーロッパでは、標準日付は UTC+01:00、夏時間は UTC+02:00 です。そのため、CA とヨーロッパの差は 9 時間です。ただし、1 年に 2 回、いずれかの地域で標準モードと夏時間モードが切り替わる場合を除きます。

アップデート:

コメントをもう少し考えて読んだ後、私が理想的に必要とするのはこれです:

var utcOffset = f('2013-08-15T10:00', 'America/Los_Angeles');
// utcOffset == "-07:00"
var utcOffset = f('2013-11-15T10:00', 'America/Los_Angeles');
// utcOffset == "-08:00"

これまでのところ、Guido Preite によって提案されたmoment.js/timezone pluginがこれを行うことができるようです (多かれ少なかれ)。

ブラウザ API を使用する他の方法はありますか?

4

3 に答える 3

23

javascriptで、外部Webサービスなしで正しい変換を行う方法はありますか? つまり、夏時間であるため、午前 10 時 UTC-08:00 が実際には午前 10 時 UTC-07:00 であることを検出します。

10:00-8 と 10:00-7 は 2 つの異なる時間です。それらはそれぞれ 18:00Z と 17:00Z に等しい (Z = UTC)。オフセットに関して測定している場合、サマータイムは関係ありません。これまで。

カリフォルニア州の標準時間帯は PST であるため、夏時間に PDT で考えることに切り替える人はいないのではないでしょうか。それとも彼らですか?

一般的に、人々は「太平洋時間」で考えるだけで、それは冬の PST と夏の PDT の両方を意味します。しかし、コンピュータはより正確です。PST と表示されている場合は、UTC-8 を意味します。PDT と表示されている場合は、UTC-7 を意味します。1 つのフォームを使用してラベルを付けながら、同時に別のフォームのオフセットを参照することは無効です。

タイム ゾーンの略語はあいまいな場合があります。理想的には、プログラムでゾーンを参照するときは、 などの IANA ゾーン名を使用する必要がありますAmerica/Los_Angeles。ただし、これは現在、ライブラリを使用しないすべての JavaScript ランタイムで可能というわけではありません。(彼らはこれに取り組んでいます。)

中央ヨーロッパでは、標準日付は UTC+01:00、夏時間は UTC+02:00 です。そのため、CA とヨーロッパの差は 9 時間です。ただし、1 年に 2 回、いずれかの地域で標準モードと夏時間モードが切り替わる場合を除きます。

正しい。それらは、8時間、9時間、または10時間離れている可能性があります。ただし、それらは完全に異なるタイミングで切り替わるため、自分でこれを管理しようとしないでください.

これまでのところ、Guido Preite によって提案された moment.js/timezone プラグインがこれを行うことができるようです (多かれ少なかれ)。

Moment-timezoneは優れたライブラリです。しかし、あなたが説明したシナリオからすると、あなたが考えているほどタイムゾーンの変換について心配する必要はないと思います。このロジックに従うことができるかどうかを確認してください。

  1. カリフォルニアのユーザーが日付と時刻をテキスト ボックスに入力します。
  2. そのテキストボックスの値を文字列に読み取り、それを解析して日付にします。

    var dt = new Date("8/15/2013 10:00");
    

    または moment.js を使用する:

    var m = moment("8/15/2013 10:00", "M/D/YYYY HH:mm");
    
  3. これはユーザーのコンピューターで行われているため、JavaScript はこれがローカルの日付と時刻であると自動的に想定します。オフセットやタイム ゾーン情報を指定する必要はありません。

  4. これは、DST 移行のために、入力された時間が無効またはあいまいになる可能性があることを意味します。実際、JavaScript はそれをうまく処理できません。実際には、異なるブラウザーでは異なる結果が得られます。明確にしたい場合は、オフセットを指定します。

    // PST
    var dt = new Date("3/11/2013 1:00 UTC-08:00");
    
    // PDT
    var dt = new Date("3/11/2013 1:00 UTC-07:00");
    
  5. Date(または) を取得したらmoment、UTC に相当するものを評価できます。

    var s = dt.toISOString();  //  2013-08-15T17:00:00Z
    

    これは moment.js でも同じですが、ブラウザのサポートが向上します。

    var s = m.toISOString();  //  2013-08-15T17:00:00Z
    
  6. その UTC 値をデータベースに保存します。

  7. 中央ヨーロッパの別のユーザーがやって来て、データをロードします。

  8. DateまたはmomentJavaScriptでそれをフィードします。

    var dt = new Date("2013-08-15T17:00:00Z");
    

    または moment.js を使用する (ここでも、ブラウザーのサポートが向上しています)

    var m = moment("2013-08-15T17:00:00Z")
    
  9. JavaScript はローカル コンピューターのタイム ゾーン規則を認識しているため、この日付を表示できるようになり、中央ヨーロッパのタイム ゾーンが表示されます。

    var s = dt.ToString();  //  browser specific output
    // ex: "Thu Aug 15 2013 19:00:00 GMT+0200 (Central Europe Daylight Time)"
    

    または moment.js を使用すると、出力形式をより適切に制御できます

    var s = m.format("DD/MM/YYYY HH:mm"); // "15/08/2013 19:00"
    

    出力するローカライズされた形式を moment.js に決定させることもできます。

    var s = m.format("llll"); // "Thu, 15 Aug 2013 19:00"
    

要約すると、ローカル タイム ゾーン (タイム ゾーンが何であれ) との間の変換のみに関心がある場合は、Date. Moment.js を使用すると、解析と書式設定が簡単になりますが、絶対に必要というわけではありません。

タイム ゾーン ライブラリ (moment-timezone など)を必要とするシナリオはごくわずかです。

  • ローカル タイム ゾーンまたは UTC 以外のゾーンとの間変換したい。

  • 過去の日付を操作しており、それ以降タイム ゾーン規則または夏時間規則が変更されており、新しい規則では古い規則とは異なって解釈される日付があります。これは少し技術的ですが、起こります。詳細はこちらこちらをご覧ください。

于 2013-08-02T16:17:54.647 に答える