07/26/2010
JavaScriptを使用してUNIXタイムスタンプに変換するにはどうすればよいですか?
回答:
new Date("2010-7-26")
Internet Explorerでは解析されません。 日付コンストラクタは、文字列が渡されるとDate.parse()メソッドに依存します。これは、ECMA-262 3rdエディションでは実装に依存し、その結果、IEで非常に柔軟性がありません。
見てくださいhttp://www.w3schools.com/jsref/jsref_obj_date.aspを
UTC()
UNIXエポックからミリ秒を返す関数があります。
一部の回答では、JavaScript Dateオブジェクトのタイムゾーンの変動による副作用について説明していません。したがって、これが懸念される場合は、この回答を検討する必要があります。
方法1:マシンのタイムゾーンに依存
デフォルトでは、JavaScriptはマシンのタイムゾーンを考慮して日付を返すため、getTime()
結果はコンピューターによって異なります。実行中のこの動作を確認できます:
new Date(1970, 0, 1, 0, 0, 0, 0).getTime()
// Since 1970-01-01 is Epoch, you may expect ZERO
// but in fact the result varies based on computer's timezone
エポック以降のタイムゾーンを考慮したい場合は、問題ありません。そのため、エポック以降の現在の日付、またはコンピュータのタイムゾーンに基づいて指定された日付の時間を取得する場合は、このメソッドを引き続き使用できます。
// Seconds since Epoch (Unix timestamp format)
new Date().getTime() / 1000 // local Date/Time since Epoch in seconds
new Date(2020, 11, 1).getTime() / 1000 // time since Epoch to 2020-12-01 00:00 (local timezone) in seconds
// Milliseconds since Epoch (used by some systems, eg. JavaScript itself)
new Date().getTime() // local Date/Time since Epoch in milliseconds
new Date(2020, 0, 2).getTime() // time since Epoch to 2020-01-02 00:00 (local timezone) in milliseconds
// **Warning**: notice that MONTHS in JavaScript Dates starts in zero (0 = January, 11 = December)
方法2:マシンのタイムゾーンに依存しない
ただし、タイムゾーンの変化に乗って、UTCの指定された日付(つまり、タイムゾーンに依存しない)のエポック以降の時間を取得する場合は、Date.UTC
メソッドを使用するか、日付をタイムゾーンからUTCにシフトする必要があります。
Date.UTC(1970, 0, 1)
// should be ZERO in any computer, since it is ZERO the difference from Epoch
// Alternatively (if, for some reason, you do not want Date.UTC)
const timezone_diff = new Date(1970, 0, 1).getTime() // difference in milliseconds between your timezone and UTC
(new Date(1970, 0, 1).getTime() - timezone_diff)
// should be ZERO in any computer, since it is ZERO the difference from Epoch
したがって、この方法を使用すると(または、差を差し引くと)、結果は次のようになります。
// Seconds since Epoch (Unix timestamp format)
Date.UTC(2020, 0, 1) / 1000 // time since Epoch to 2020-01-01 00:00 UTC in seconds
// Alternatively (if, for some reason, you do not want Date.UTC)
const timezone_diff = new Date(1970, 0, 1).getTime()
(new Date(2020, 0, 1).getTime() - timezone_diff) / 1000 // time since Epoch to 2020-01-01 00:00 UTC in seconds
(new Date(2020, 11, 1).getTime() - timezone_diff) / 1000 // time since Epoch to 2020-12-01 00:00 UTC in seconds
// Milliseconds since Epoch (used by some systems, eg. JavaScript itself)
Date.UTC(2020, 0, 2) // time since Epoch to 2020-01-02 00:00 UTC in milliseconds
// Alternatively (if, for some reason, you do not want Date.UTC)
const timezone_diff = new Date(1970, 0, 1).getTime()
(new Date(2020, 0, 2).getTime() - timezone_diff) // time since Epoch to 2020-01-02 00:00 UTC in milliseconds
// **Warning**: notice that MONTHS in JavaScript Dates starts in zero (0 = January, 11 = December)
IMO、何をしているのかが分からない場合(上記の注を参照)、マシンに依存しないため、方法2を選択する必要があります。
エンドノート
この回答の推奨事項は、Date.UTC
日付と時刻を指定しないと機能しないため、別の方法を使用して次のようなことをする傾向があります。
const timezone_diff = new Date(1970, 0, 1).getTime()
(new Date().getTime() - timezone_diff) // <-- !!! new Date() without arguments
// means "local Date/Time subtracted by timezone since Epoch" (?)
これは意味がなく、おそらく間違っています(日付を変更しています)。これを行わないことに注意してください。現在の日付と時刻からエポック以降の時間を取得したい場合は、おそらく方法1を使用して問題ありません。
Date.parse()
メソッドは日付の文字列表現を解析し、からのミリ秒数を返しますJanuary 1, 1970, 00:00:00 UTC
。
const unixTimeZero = Date.parse('01 Jan 1970 00:00:00 GMT');
const javaScriptRelease = Date.parse('04 Dec 1995 00:12:00 GMT');
console.log(unixTimeZero);
// expected output: 0
console.log(javaScriptRelease);
// expected output: 818035920000
詳しくは、Date.parse()をご覧ください。