web-dev-qa-db-ja.com

タイムゾーンのJavaScriptなしで日付を解析

JavaScriptでタイムゾーンなしで日付を解析したいです。私が試してみました:

new Date(Date.parse("2005-07-08T00:00:00+0000"));

2005年7月8日金曜日02:00:00 GMT + 02(中央ヨーロッパ夏時間)

new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));

同じ結果を返す

new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));

同じ結果を返す

私は時間を解析したいです。

  1. タイムゾーンなし.

  2. コンストラクタDate.UTCまたは新しいDate(年、月、日)を呼び出さずに。

  3. 単純に文字列をDateコンストラクタに渡す(プロトタイプアプローチなし)。

  4. DateではなくStringオブジェクトを生成する必要があります。

107
Athlan

日付は正しく解析されます、それはあなたのローカルタイムゾーンに変換するのはto​​Stringです:

> new Date(Date.parse("2005-07-08T11:22:33+0000"))
Fri Jul 08 2005 13:22:33 GMT+0200 (CEST)
> new Date(Date.parse("2005-07-08T11:22:33+0000")).toUTCString()
"Fri, 08 Jul 2005 11:22:33 GMT"

Javascript Dateオブジェクトはタイムスタンプです - それらは単にエポックからのミリ秒数を含みます。 Dateオブジェクトにはタイムゾーン情報はありません。このタイムスタンプが表すカレンダーの日付(日、分、秒)は、解釈の問題です(to...Stringメソッドの1つ)。

上記の例は、日付が正しく解析されていることを示しています。つまり、GMTの "2005-07-08T11:22:33"に対応するミリ秒数が実際に含まれています。

79
georg

私は同じ問題を抱えています。たとえば、「2016-08-25T00:00:00」のように日付を文字列として取得しますが、Dateオブジェクトは正しい時刻にする必要があります。 Stringをオブジェクトに変換するには、getTimezoneOffsetを使います。

var date = new Date('2016-08-25T00:00:00')
var userTimezoneOffset = date.getTimezoneOffset() * 60000;
new Date(date.getTime() - userTimezoneOffset);

getTimezoneOffset()は負または正の値を返します。これは、世界のあらゆる場所で機能するために差し引かれる必要があります。

78
wawka

私は同じ問題に遭遇し、それから私が取り組んでいたレガシープロジェクトと彼らがこの問題をどう扱ったかについて気まずい何かを思い出しました。私は当時それを理解していなかったし、私が自分で問題に遭遇するまで本当に気にしていませんでした

var date = '2014-01-02T00:00:00.000Z'
date = date.substring(0,10).split('-')
date = date[1] + '-' + date[2] + '-' + date[0]

new Date(date) #Thu Jan 02 2014 00:00:00 GMT-0600

何らかの理由で日付を '01 -02-2014'として渡すと、タイムゾーンがゼロに設定され、ユーザーのタイムゾーンは無視されます。これはDateクラスの中身ではないかもしれませんが、それは少し前に存在し、今日存在しています。そしてそれはクロスブラウザで動作するようです。自分で試してみてください。

このコードは、タイムゾーンが非常に重要であるグローバルプロジェクトで実装されていますが、日付を見ている人はそれが導入された正確な瞬間を気にしませんでした。

11
Iwnnay

Dateオブジェクト自体はとにかくタイムゾーンを含み、返される結果はデフォルトの方法でそれを文字列に変換した結果です。すなわち日付オブジェクトを作成することはできませんwithout timezone。しかしあなたができることはあなた自身のものを作成することによってDateオブジェクトのふるまいをまねることです。しかし、これは moment.js のようなライブラリに引き渡すほうが良いでしょう。

5
mishik

簡単な解決策

const handler1 = {
  construct(target, args) {
    let newDate = new target(...args);
    var tzDifference = newDate.getTimezoneOffset();
    return new target(newDate.getTime() + tzDifference * 60 * 1000);
  }
};

Date = new Proxy(Date, handler1);
2
alexey

これは私のために働くこの問題のために私が思い付いた解決策です。


使用されるライブラリ:プレーンなJavaScriptを持つmomentjs Dateクラス。

Step 1. String dateをmomentオブジェクトに変換します(PS:momentはtoDate()メソッドが呼び出されない限り元の日時を保持します):

const dateMoment = moment("2005-07-08T11:22:33+0000");

ステップ2.以前に作成したモーメントオブジェクトからhoursおよびminutesの値を抽出します。

  const hours = dateMoment.hours();
  const mins = dateMoment.minutes();

ステップ3.日付をモーメントに変換する(PS:ブラウザ/マシンのタイムゾーンに基づいて元の日付が変更されますが、心配しないでステップ4を読んでください)。

  const dateObj = dateMoment.toDate();

ステップ4.ステップ2で抽出した時間と分を手動で設定します。

  dateObj.setHours(hours);
  dateObj.setMinutes(mins);

Step 5. dateObjはタイムゾーンの違いなしに元のDateを表示します。元の時間と分を手動で設定しているため、夏時間の変更でも日付オブジェクトには影響しません。

お役に立てれば。

0
saran3h

一般的なメモです。それを柔軟に保つ方法。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

GetMinutes()を使用できますが、最初の9分間に返される数値は1つだけです。

let Epoch = new Date() // Or any unix timestamp

let za = new Date(Epoch),
    zaR = za.getUTCFullYear(),
    zaMth = za.getUTCMonth(),
    zaDs = za.getUTCDate(),
    zaTm = za.toTimeString().substr(0,5);

console.log(zaR +"-" + zaMth + "-" + zaDs, zaTm)
Date.prototype.getDate()
    Returns the day of the month (1-31) for the specified date according to local time.
Date.prototype.getDay()
    Returns the day of the week (0-6) for the specified date according to local time.
Date.prototype.getFullYear()
    Returns the year (4 digits for 4-digit years) of the specified date according to local time.
Date.prototype.getHours()
    Returns the hour (0-23) in the specified date according to local time.
Date.prototype.getMilliseconds()
    Returns the milliseconds (0-999) in the specified date according to local time.
Date.prototype.getMinutes()
    Returns the minutes (0-59) in the specified date according to local time.
Date.prototype.getMonth()
    Returns the month (0-11) in the specified date according to local time.
Date.prototype.getSeconds()
    Returns the seconds (0-59) in the specified date according to local time.
Date.prototype.getTime()
    Returns the numeric value of the specified date as the number of milliseconds since January 1, 1970, 00:00:00 UTC (negative for prior times).
Date.prototype.getTimezoneOffset()
    Returns the time-zone offset in minutes for the current locale.
Date.prototype.getUTCDate()
    Returns the day (date) of the month (1-31) in the specified date according to universal time.
Date.prototype.getUTCDay()
    Returns the day of the week (0-6) in the specified date according to universal time.
Date.prototype.getUTCFullYear()
    Returns the year (4 digits for 4-digit years) in the specified date according to universal time.
Date.prototype.getUTCHours()
    Returns the hours (0-23) in the specified date according to universal time.
Date.prototype.getUTCMilliseconds()
    Returns the milliseconds (0-999) in the specified date according to universal time.
Date.prototype.getUTCMinutes()
    Returns the minutes (0-59) in the specified date according to universal time.
Date.prototype.getUTCMonth()
    Returns the month (0-11) in the specified date according to universal time.
Date.prototype.getUTCSeconds()
    Returns the seconds (0-59) in the specified date according to universal time.
Date.prototype.getYear()
    Returns the year (usually 2-3 digits) in the specified date according to local time. Use getFullYear() instead. 
0
Cryptopat