JavaScriptでUTCタイムスタンプを取得するにはどうすればよいですか?


157

Webアプリケーションの作成中は、すべての日時をUTCタイムスタンプとしてDB に保存(サーバー側)することが理にかなっています。

JavaScriptでのタイムゾーン操作に関して、ネイティブでは多くのことを実行できないことに気づいたとき、私は驚きました。

Dateオブジェクトを少し拡張しました。この機能は意味がありますか?基本的に、サーバーに何かを送信するたびに、この関数でフォーマットされたタイムスタンプになります...

ここで何か大きな問題を見ることができますか?それとも別の角度からの解決策ですか?

Date.prototype.getUTCTime = function(){ 
  return new Date(
    this.getUTCFullYear(),
    this.getUTCMonth(),
    this.getUTCDate(),
    this.getUTCHours(),
    this.getUTCMinutes(), 
    this.getUTCSeconds()
  ).getTime(); 
}

少し複雑に思えます。また、パフォーマンスについてもよくわかりません。


私はこれが古い質問の一種であることを知っていますが、Dateオブジェクトのようなネイティブオブジェクトを拡張しないようにしてください。質問自体が好きなので賛成です。
トリシス

Date.parse(new Date()。toUTCString())
Sagi

25
これは今日私のフィードで出てきた古い質問であり、それは誤った情報でいっぱいです。タイムスタンプは常にUTCです。 new Date().toString()現在のタイムゾーンの時間表現new Date().toUTCString()を表示し、UTC時間のreprを表示しますnew Date().getTime()が、常にUTCです。これは、Unix時間が次のように定義されているためです。時間内。1970年1月1日木曜日の00:00:00協定世界時(UTC)から経過した秒数として定義され、うるう秒はカウントされません。
アマダン

回答:


155
  1. この方法で作成された日付はローカルタイムゾーンを使用するため、作成された日付は正しくありません。特定の日付オブジェクトのタイムゾーンを設定するには、タイムゾーンを含む日付文字列からオブジェクトを作成します。(私はそれを古いAndroidブラウザーで動作させるのに問題がありました。)

  2. getTime()は単純な秒ではなくミリ秒を返すことに注意してください。

UTC / Unixタイムスタンプの場合、以下で十分です。

Math.floor((new Date()).getTime() / 1000)

現在のタイムゾーンのオフセットが結果に反映されます。文字列表現の場合、David Ellisの答えが機能します。

明確にするために:

new Date(Y, M, D, h, m, s)

その入力は現地時間として扱われます。場合はUTC時刻が渡され、結果が異なります。観察(私は今GMT +02:00にいます、そしてそれは07:50です):

> var d1 = new Date();
> d1.toUTCString();
"Sun, 18 Mar 2012 05:50:34 GMT" // two hours less than my local time
> Math.floor(d1.getTime()/ 1000)
1332049834 

> var d2 = new Date( d1.getUTCFullYear(), d1.getUTCMonth(), d1.getUTCDate(), d1.getUTCHours(), d1.getUTCMinutes(), d1.getUTCSeconds() );
> d2.toUTCString();
"Sun, 18 Mar 2012 03:50:34 GMT" // four hours less than my local time, and two hours less than the original time - because my GMT+2 input was interpreted as GMT+0!
> Math.floor(d2.getTime()/ 1000)
1332042634

また、のgetUTCDate()代わりに使用できないことにも注意してくださいgetUTCDay()。これは、月の日をgetUTCDate()返すためです。一方、曜日を返します。getUTCDay()


1
1)日付を作成しませんでした... これで機能するプロトタイプ関数を追加しました。2)良い点は、Math.floor / 1000を実行する必要があります-しかし、既存の日付オブジェクトのUTCタイムスタンプを取得するには、この関数が必要です...
Merc

@Merc:1)を呼び出しnew Date()ています。これにより、UTC入力から新しい日付が作成されますが、ローカルの日付/時刻として扱われます。2)はい、Math.floor(this.getTime() / 1000)この場合に使用する必要があります。
DCoder 2012年

コードを更新する必要があるため、ここで答えます...これは、既存の日付のUTCのUnixタイムスタンプを取得するためです。this.getUTCDate()、this.getUTCHours()、this.getUTCMinutes()、this.getUTCSeconds()).getTime()/ 1000); これは、私ができることを意味します:var n = new Date(2008,10,10)... ... n.getUTCTime(); (これはn.getUTCTime()とは異なります)
Merc

1
ありがとうBroその作業ファイルMath.floor((new Date())。getTime()/ 1000)
Manoj Patel

51

getTimezoneOffsetとgetTimeを利用してそれを行うこともできます、

x = new Date()
var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000)/1000;

console.log("UTCseconds", UTCseconds)


4
おかげで、これはインターネット上で見つけることはできません!
Theofanis Pantelides 2015

次のコードをテストしますvar tt = new Date('Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)'); (tt.getTime() - tt.getTimezoneOffset()*60*1000)/1000。それtt.getTime() - tt.getTimezoneOffset()は正しいようですGMT+0800
zangw

1
これはもっと良いvar UTCseconds = (Math.floor(x.getTime()/1000) + x.getTimezoneOffset()*60)
StefansArya 2017年

書かれたとして、これは仕事をしないようにそれはあなたに時間文字列を渡すために持っているように見えます..見えるnew Date()ちょっと.. JSでそれをやろうとの目的に反しtimezone..which含んでいる
claudekennilol

これはに割り当てられた値は、単に間違っているUTCsecondsは ない UTC秒で..日の時間値がある、それは時間の異なる瞬間を表しどんな方法によってそれを変更、UTC。
RobG

35

従来の形式でUTC時間を取得する最も簡単な方法は次のとおりです。

new Date().toISOString()
"2016-06-03T23:15:33.008Z"

3
これが正解です。他の多くの答えは「普遍的な時間の文字列」を与えますが、現在の「普遍的な調整された時間」を与えません。ここですべてがなぜこんなに複雑なのか理解できません。
gburton

@gburtonありがとうございます。真実への簡単な方法をご覧いただきありがとうございます。:)
Tahsin Turkoz

1
これを「.split( 'T')[0]」とともに使用して、YYYY-MM-DDの日付ベースの比較を簡単に行います。
Sean O

@SeanOがいい
Tahsin Turkoz

これはUTCタイムストリングを提供しますが、OPはUTC タイムスタンプ(エポック)を求めています
Jordi Nebot

13

実際、jsのDate値は、C#のDateTimeオブジェクトと言うよりもはるかに優れていると思います。C#のDateTimeオブジェクトにはKindプロパティがありますが、厳密な基本的なタイムゾーンはありません。2つの非UTC時間と非ローカル時間の間で変換する場合、タイムゾーン変換を追跡することは困難です。jsでは、すべてのDate値には、実行するオフセットまたはタイムゾーンの変換に関係なく渡され、既知の基礎となるUTC値があります。Dateオブジェクトに関する私の最大の不満は、ブラウザーの実装者が含めることを選択した未定義の動作の量です。これは、jsで日付を攻撃する人々を、仕様を読むよりも試行錯誤して混乱させる可能性があります。iso8601.jsのようなものを使用すると、Dateオブジェクトの単一の実装を定義することにより、このさまざまな動作が解決されます。

デフォルトでは、仕様では次のような拡張ISO 8601日付形式で日付を作成できると記載されています

var someDate = new Date('2010-12-12T12:00Z');

したがって、この方法で正確なUTC時間を推測できます。

Date値をサーバーに返したい場合は、次のように呼び出します。

someDate.toISOString();

または、ミリ秒のタイムスタンプを使用したい場合(1970年1月1日のUTCからのミリ秒数)

someDate.getTime();

ISO 8601が標準です。日付オフセットを含めると、日付文字列の意味について混乱することはありません。開発者にとってこれが意味することは、自分で現地時間の変換を処理する必要がないということです。現地時間の値は純粋にユーザーの利益のために存在し、デフォルトでは日付値は現地時間で表示されます。すべての現地時間の操作により、ユーザーにわかりやすい何かを表示したり、ユーザー入力から文字列を変換したりできます。できるだけ早くUTCに変換することをお勧めします。jsDateオブジェクトはこれをかなり簡単にします。

マイナス面としては、クライアントのタイムゾーンやロケールを強制する余地はあまりありません(私が知っていることです)。これは、Webサイト固有の設定に迷惑をかける可能性がありますが、これの背後にある理由は、ユーザーであることです。触れてはいけない構成。

つまり、簡単に言えば、タイムゾーン操作に対するネイティブサポートがそれほど多くないのは、単にそれを実行したくないからです。


12

通常、クライアント側で「タイムゾーン操作」の多くを行う必要はありません。原則として、UTCの日付を「1970年1月1日の午前0時からのミリ秒数ticks」の形式で保存して処理しようとします。これにより、保存、並べ替え、オフセットの計算が非常に簡単になり、何よりも「夏時間」の調整の頭痛がなくなります。これが私が使用する小さなJavaScriptコードです。

現在のUTC時間を取得するには:

function getCurrentTimeUTC()
{
    //RETURN:
    //      = number of milliseconds between current UTC time and midnight of January 1, 1970
    var tmLoc = new Date();
    //The offset is in minutes -- convert it to ms
    return tmLoc.getTime() + tmLoc.getTimezoneOffset() * 60000;
}

次に、一般的に必要なのは、エンドユーザーのローカルタイムゾーンとフォーマットに合わせて日付/時刻をフォーマットすることです。以下は、クライアントコンピューターの日付と時刻の形式のすべての複雑さを処理します。

function formatDateTimeFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted date/time
    return new Date(nTicks).toLocaleString();
}

function formatDateFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted date
    return new Date(nTicks).toLocaleDateString();
}

function formatTimeFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted time
    return new Date(nTicks).toLocaleTimeString();
}

したがって、次の例:

var ticks = getCurrentTimeUTC();  //Or get it from the server

var __s = "ticks=" + ticks + 
    ", DateTime=" + formatDateTimeFromTicks(ticks) +
    ", Date=" + formatDateFromTicks(ticks) +
    ", Time=" + formatTimeFromTicks(ticks);

document.write("<span>" + __s + "</span>");

以下を返します(私の米国英語ロケールの場合):

ticks = 1409103400661、DateTime = 8/26/2014 6:36:40 PM、Date = 8/26/2014、Time = 6:36:40 PM


1
関数にgetTimezoneOffset値を追加することで、getCurrentTimeUTC実際には別の時点を返します。の結果getTimeすでに UTCにあります。
Matt Johnson-Pint 2015年

1
@MattJohnson:不正解です。の結果tmLoc.getTime()は、現地時間に対するオフセットです。JavaScriptを実行するものにアクセスできるかどうかは簡単に確認できます。
ahmd0 2015年

2
申し訳ありませんが、そうではありません。参照してくださいMDN参照を。これはECMAScript仕様でも確認できます。§15.9.3.3説明getTimeで定義された「時間値」であなたを指している、§15.9.5で、PrimitiveValue中にセットとして、§15.9.3.3明示UTCとして。
Matt Johnson-Pint 2015年

2
まあ、あなたがをtmLoc介して取得するnew Date()ので、それは同じことです。タイムゾーンは、tmLoc.toString()および同様のアイテムの文字列出力に影響しますが、影響はありません。tmLoc.getTime() これは、UTCでの1970-01-01の午前0時からのミリ秒数です。
Matt Johnson-Pint 2015年

1
@StefansArya://The offset is in minutes -- convert it to ms
ahmd0 2017年

5

これはより良い解決策だと思います

// UTC milliseconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()

// UTC seconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()/1000|0

もう1 つの間違った答えは、getTimeがUTCオフセットを返し、ローカルタイムゾーンオフセットを追加すると完全に混乱することです。ECMAScriptオフセットは、西の場合は+ ve、東の場合は-veなので、ローカルにするにはUTCから差し引く必要があります。ただし、時間値は最初はUTCであるため、追加すると、基本的にUTCからローカルオフセットと反対方向にシフトされます。
RobG

4

あなたがしたい場合は1つのライナーをUTCのUnixタイムスタンプを JavaScriptでとして作成することができます。

var currentUnixTimestap = ~~(+new Date() / 1000);

これは、システムのタイムゾーンを考慮に入れます。基本的には、エポックからの経過秒数です。

使い方:

  • 日付オブジェクトを作成しますnew Date()
  • unary +オブジェクト作成前に追加してタイムスタンプに変換し、それをに変換しtimestamp integerます。:+new Date()
  • ミリ秒を秒に変換します。 +new Date() / 1000
  • 値を整数に丸めるには、ダブルチルドを使用します。:~~(+new Date())

7
それはだtilde、ではないtilda(原文のまま)。残念ながら、タイプミスを削除することはできません。少なくとも6文字の編集を行う必要があります。スムーズ、Stackexchange、スムーズ
フレッド

3
これは使用しないでください。現在のecma仕様では、ビットごとの演算(チルド-ビットごとではない)は32ビットの符号付き整数値を処理します。つまり、このチルドマジック、タイムスタンプ値が32ビットの符号付き整数の最大値を超える2038年1月19日以降は機能しませんjsfiddle.net/phb20ymb
Sharky

3

new Date()。getTime()が実際にUTC値を返すことを明確にしたいので、ローカライズされた時間に依存しない方法で日付を格納および管理することは非常に役立ちます。

つまり、すべてのUTC JavaScript関数を気にする必要はありません。代わりに、Date.getTime()を使用してください。

説明の詳細はこちら: javascript "(new Date())。getTime()"が2つの異なるタイムゾーンから実行される場合。


3

私は以下を使用します:

Date.prototype.getUTCTime = function(){ 
  return this.getTime()-(this.getTimezoneOffset()*60000); 
};

このメソッドを定義すると、次のことができます。

var utcTime = new Date().getUTCTime();

最もクリーンなソリューション。どうも!
avalanche1

ただし、TimeStampsは常にUTCであるため、日付を送信するための適切なソリューションではありません。日付を送信するときの私にとっての最良の解決策は、 "dd / MM / yyyy HH:mm:ss"のような文字列表現を使用し、サーバーのデフォルトのTimeZoneを使用してサーバー側で解析し、UTCタイムスタンプなどを取得することです。この回答を
jlbofh 2018

2
文字列の解析-あなたはそれをきれいと呼んでいますか?meh
なだれ1

ISO仕様に従って日付を文字列形式で生成する方法があることを確認してください。メソッドはtoISOString()です。:あなたのような何か使用してJavaできれいにそれを解析することができますDateTime dt = new DateTime ("2018-07-15T02:36:00+02:00");
jlbofh

もう1 つの間違った答えthis.getTime()は、UTCオフセットを返し、ローカルタイムゾーンオフセットを引くとUTCではなくローカルになるため、getUTCTimeはUTCではなくローカルオフセットを返します。
RobG

2

この質問がどれほど複雑になったかに驚いています。

これらはすべて同一であり、整数値はすべて=== EPOCH時間:D

console.log((new Date()).getTime() / 1000, new Date().valueOf() / 1000, (new Date() - new Date().getTimezoneOffset() * 60 * 1000) / 1000);

私を信じてはいけない、チェックアウト:http : //www.epochconverter.com/


2

new Date().toUTCString()ように文字列を返すので"Wed, 11 Oct 2017 09:24:41 GMT"、最後の3文字をスライスして、スライスした文字列をnew Date()次のように渡すことができます。

new Date()
// Wed Oct 11 2017 11:34:33 GMT+0200 (CEST)

new Date(new Date().toUTCString().slice(0, -3))
// Wed Oct 11 2017 09:34:33 GMT+0200 (CEST)

1

編集:以下のコードは機能しません。私は常に、新しいDate()。getTime()が1970年1月1日から現在のタイムゾーンでの秒数を返すと想定していました。これは当てはまりません。getTime()は秒数をUTCで返します。そのため、以下のコードは大幅な過剰調整を行います。みなさんありがとう!

まず、素晴らしい洞察をありがとうございます。私の質問のタイトルが間違っていたと思います...それは「既存の日付のUTC Unixタイムスタンプを取得する」であるべきでした。

したがって、日付オブジェクトがある場合:

var d = new Date(2009,01,31)

「UTC Unixタイムスタンプ」を教えてくれる関数を探していました。

この関数は本当のトリックのようです:

Date.prototype.getUTCUnixTime =  function (){
  return Math.floor( new Date(
    this.getUTCFullYear(),
    this.getUTCMonth(),
    this.getUTCDate(),
    this.getUTCHours(),
    this.getUTCMinutes(), 
    this.getUTCSeconds()
  ).getTime() / 1000); 
}

「これ」で機能することに注意してください。これは私ができることを意味します:

var n = new Date(2008,10,10)
...
...

n.getUTCUnixTime();

そして、Unix時間で1970年1月1日からの秒数を取得します。正しい?

私には、JavascriptがすべてをUTC時間で保存するのは少し狂気ですが、その数を取得するために、個々のUTCゲッターを渡す新しいDateオブジェクトを作成し、最後にそのためにgetTime()を呼び出す必要があります...

Merc。


1
@DCoderの彼の回答の更新を見ましたか?あなたのメソッドgetUTCUnixTimeは間違った時間を取得し、JavaScript DateオブジェクトからUNIXタイムスタンプを取得する簡単な方法を提供します- getTimeメソッドを使用します。他のすべての回答を参照してください。
Anurag

1
ああ、あなたは正しい、ちょうどそれらを見た。(頭を壁にぶつけて)
Merc

1

これはあなたが期待していることだと思います...

var currTimestamp = Date.now(), //1482905176396
    utcDateString = (new Date(currTimestamp)).toUTCString(); //"Wed, 28 Dec 2016 06:06:50 GMT"

さて、

new Date(utcDateString).getTime(); //This will give you UTC Timestamp in JavaScript


0

day.jsの使用

ブラウザで:

dayjs.extend(dayjs_plugin_utc)
console.log(dayjs.utc().unix())
<script src="https://cdn.jsdelivr.net/npm/dayjs@latest/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@latest/plugin/utc.js"></script>

node.js:

import dayjs from 'dayjs'
dayjs.extend(require('dayjs/plugin/utc'))
console.log(dayjs.utc().unix())

ミリ秒のないUTC UNIXタイムスタンプを取得します。


-2

これは、タイムスタンプをUTCで返します。

var utc = new Date(new Date().toUTCString()).getTime();


2
これはUTCの時間を返しません:new Date(new Date().toUTCString())2017年10月4日水曜日07:20:14 GMT + 0200(GMT + 02:00)
Bas van Dijk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.