UTCエポックを現地日付に変換


275

私は今これと少し戦っています。エポックを日付オブジェクトに変換しようとしています。エポックはUTCで私に送信されます。new Date()エポックを渡すときはいつでも、それはローカルエポックであると想定します。UTCオブジェクトを作成し、それを使用setTime()して適切なエポックに調整しようとしましたが、有用であるtoUTCString()と思われる唯一の方法は、文字列が役に立たないことです。その文字列を新しい日付に渡すと、UTCであることがわかりますが、そうではありません。

new Date( new Date().toUTCString() ).toLocaleString()

私の次の試みは、ローカルの現在のエポックとUTCの現在のエポックの違いを取得しようとすることでしたが、それも取得できませんでした。

new Date( new Date().toUTCString() ).getTime() - new Date().getTime()

それは、ミリ秒単位である1000未満の非常に小さな違いを与えているだけです。

助言がありますか?


11
エポック時間は、1970年の日付からUTCで経過したミリ秒として定義されます。地元の時代というものはありません!よくわかりません。
Chetan Sastry、2011年

コンピューターのタイムゾーンが正しくないため、UTC値が異なる可能性がありますか?
kijin、2011年

2
toLocaleString()を使用してUTC時間を「確認」したい場合は、クロックをUTC時間に設定する必要があります。真夜中のUTCは午後7時(EST)です。localeStringの代わりにnew Date()。toString()を使用すると、「Fri Jan 07 2011 07:00:00 GMT-0500」のようになり、オフセットが含まれます。
ケネベック2011年

回答:


467

私はより簡単な解決策があると思います-初期日付をエポックに設定し、UTCユニットを追加します。秒単位で保存されているUTCエポック変数があるとします。いかがですか1234567890。これをローカルタイムゾーンの適切な日付に変換するには:

var utcSeconds = 1234567890;
var d = new Date(0); // The 0 there is the key, which sets the date to the epoch
d.setUTCSeconds(utcSeconds);

d に設定された日付(私のタイムゾーンで) Fri Feb 13 2009 18:31:30 GMT-0500 (EST)


190
FWIW、Dateオブジェクトはミリ秒で初期化できます。したがって、var d = new Date(utcSeconds * 1000)同じ結果が得られるはずです。
kurttheviking 2013年

54
var d = new Date(1234567890000)同じ結果を返す
Matjaz Lipus

11
おそらく他の人がいくつかの点からいくつかの明確さを得ることができると思いました:日付オブジェクトは「それにスタンプされた」タイムゾーンで設定されません。それを数にすぎないと考えてください。この数値は、1970年1月1 UTCから現在までのミリ秒数です(現在もUTCになっています)。したがって、日付オブジェクトを作成するときはいつでも、それは実際には裏でUTCにあります。2.その日付を表示するには、ロケール設定(toLocaleString()、またはUTCの場合(toUTCString())として表示できます。自分で変換する必要はありません。utcミリ秒で構築してください。すべて良いです。文字列-ローカルタイムゾーンである限り
da Bich

2
1234567890000は1234567890と同じように扱われ、別名Y39K問題...
muttonUp

1
@ muttonUp、1000マルチプリケーションで機能しました。しかし、「Y39K問題」グーグルは有効な結果を提供していません。どんなURLも役に立ちます
P Satish Patro

238

それは簡単で、new Date()ミリ秒しかかかりません。

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)

6
良いですね!これは実際に受け入れられた回答と見なされるべきです。
Nizar B.

これは私にとってはうまくいきませんでした。タイムスタンプがある場合はうまくいきますが、utcエポックでは手動でutcsecondsを設定する必要があります。受け入れの答えが正しい答えです
sameerali

12
これは適切な答えです。新しい日付はミリ秒かかる場合があるため、1000を掛けるだけですconst d = new Date(epoch * 1000)
Vinyll 2017

@sameeraliシステムに別の問題が発生したか、混乱した可能性があります。この答えが正解です。Unixエポックの定義:1月1日の真夜中UTCから経過した秒数。経過したミリ秒数を取得するには、1000を掛けるだけです。
nalply

32

そしてログのためだけに、私はとにかくフォーマットに使用していたMoment.jsライブラリを使用してこれを行いました。

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)

1
瞬間はいいですが、1.3MBのライブラリを使用して1つのエポックを日付に変換するのは異常です。肥大化したノードアプリがたくさんあるのも不思議ではありません。
not2qubit 2018

20

エポック時間は1970年1月1日からの秒数です。1970年1月1日からのミリ秒date.getTime()返します。つまり、エポックタイムスタンプがある場合は、1000を掛けてJavaScriptタイムスタンプに変換します。

   function epochToJsDate(ts){
        // ts = epoch timestamp
        // returns date obj
        return new Date(ts*1000);
   }

   function jsDateToEpoch(d){
        // d = javascript date obj
        // returns epoch timestamp
        return (d.getTime()-d.getMilliseconds())/1000;
   }

いったい何が起きているのだろうと思っていました。日付の解析に関しては、epochTime!== javascriptTimeを知っておくと非常に便利です。ありがとう!
GrayedFox 2018年

16
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}

1
あなたは私の日を作りました。TY。仕事のマイナス記号をプラス記号に置き換えました。
Ludovic Kuty 2013年

5

現在のエポック時間[ms]を24時間に変換します。12時間形式を無効にするオプションを指定する必要がある場合があります。

$ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));"

2/7/2018, 19:35:24

またはJSとして:

var date = new Date(Date.now()); 
console.log(date.toLocaleString('en-GB', { hour12:false } ));
// 2/7/2018, 19:35:24

console.log(date.toLocaleString('en-GB', { hour:'numeric', minute:'numeric', second:'numeric', hour12:false } ));
// 19:35:24

注:en-GBここでの使用は、24時間形式を使用した場所の(ランダムな)選択であり、タイムゾーンではありません!


1
これは、Dateメソッドからあらゆるタイプの変換を取得するための最良の方法です。ありがとう!
SeaWarrior404

上記で私が気に入らない唯一のことは、日付があいまいな形式で返されるd/m/yyyyことm/d/yyyyですか、それともそれですか?これを表示する正しい(最も論理的な)方法は次のとおりyyyy-mm-ddです。テイカーはいますか?
not2qubit

4

エポック時間(つまり、UNIXのエポック時間)はほぼ常に数で 1970年1月1日夜12時〇 〇分00秒(UTC時間)以降に期限切れになっている、いないの数ミリ秒ここでは回答の一部を暗示しています。

https://en.wikipedia.org/wiki/Unix_time

したがって、Unixエポック時間の値が指定されている場合、それはおそらく秒単位であり、のようになり1547035195ます。JavaScriptでこれを人間が読めるようにする場合は、値をミリ秒に変換し、その値をDate(value)コンストラクターに渡す必要があります。例:

const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();

d.setUTCMilliseconds(0)JavaScript Date(value)コンストラクターはUTC値をミリ秒(現地時間ではない)で取るので、受け入れられた回答の手順を実行する必要はありません。

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

またDate(...)、文字列の日時表現を取るコンストラクタの使用は避けてください。これは推奨されません(上記のリンクを参照)。


3

UTC文字列を「ローカル」文字列に変換するように求めているだけですか。あなたがすることができます:

var utc_string = '2011-09-05 20:05:15';
var local_string = (function(dtstr) {
    var t0 = new Date(dtstr);
    var t1 = Date.parse(t0.toUTCString().replace('GMT', ''));
    var t2 = (2 * t0) - t1;
    return new Date(t2).toString();
})(utc_string);

3

@djechlinによる上記の回答への追加

d = '1394104654000';
new Date(parseInt(d));

EPOCH時間を人間が読める日付に変換します。そのタイプのEPOCH時間は整数でなければならないことを忘れないでください。


3

これに対して私が見つけた最も簡単な解決策は、次のとおりです。

var timestamp = Date.now(), // returns milliseconds since epoch time
    normalisedTime = new Date(timestamp);

これはステートメント* 1000の最後にがないことに注意してください。これはnew Date(timestamp)(とにかく私にとっては!)常に間違った日付を与えるように見えるためです。


2

moments.jsのようなライブラリを使用せずに、タイムスタンプと日付のUTCおよび現地時間への変換を解決する場合は、以下のオプションを確認してください。

UTCタイムスタンプを使用するアプリケーションの場合、該当する場合はローカルタイムゾーンと夏時間を考慮してブラウザに日付を表​​示する必要がある場合があります。同じタイムゾーンでも扱いが難しい場合でも、夏時間の異なる日付を編集する。

NumberそしてDate以下の拡張機能は、あなたが表示され、タイムスタンプのタイムゾーンで日付を取得することができます。たとえば、バンクーバーにいるとしましょう。7月または12月の日付を編集している場合、PSTまたはPDTで日付を編集していることになります。

このソリューションをテストするには、下のコードスニペットを確認することをお勧めします。

ミリ秒からの変換

Number.prototype.toLocalDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() + (value.getTimezoneOffset() / 60));

    return value;
};

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

日付からの変換

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

使用法

// Adds the timezone and daylight savings if applicable
(1499670000000).toLocalDate();

// Eliminates the timezone and daylight savings if applicable
new Date(2017, 6, 10).getUTCTime();

自分で見てください


これが実際の答えです。私にとっては魅力のように働きました。新しいDate(0)を設定してmilliSecondsを追加することは、新しいDate(milliSeconds)と同じです
Jersey_Guy

1

編集

var utcDate = new Date(incomingUTCepoch);
var date = new Date();
date.setUTCDate(utcDate.getDate());
date.setUTCHours(utcDate.getHours());
date.setUTCMonth(utcDate.getMonth());
date.setUTCMinutes(utcDate.getMinutes());
date.setUTCSeconds(utcDate.getSeconds());
date.setUTCMilliseconds(utcDate.getMilliseconds());

EDIT固定


私は2番目の例でこれを行いました。それが私に与える違いは、ミリ秒
単位

それらのどれも私を助けません。彼らは完璧になるsetUTCTime方法を、不足している:Pのw3schools.com/jsref/jsref_obj_date.asp
シェーンReustle

少なくともUbuntuのFirefoxでは機能しません。コードは、日付を設定した後に日/月/年を設定しないでください。
Simon Kozlov、

@Simon Kozlov実際には日付オブジェクトの誤った仮定であり、setDateとgetDateはその月の日を参照しています。問題は、存在しない(setUTCDay)のような関数を使用したことです。
Amjad Masad

@AmjadMasad予想される出力も表示すると、回答がさらに役立ちます。
not2qubit

0

考えてみればepoch_time

// for eg. epoch_time = 1487086694.213
var date = new Date(epoch_time * 1000); // multiply by 1000 for milliseconds
var date_string = date.toLocaleString('en-GB');  // 24 hour format


0

@Amjad、良いアイデアですが、より良い実装は次のようになります:

Date.prototype.setUTCTime = function(UTCTimestamp) {
    var UTCDate = new Date(UTCTimestamp);
    this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate());
    this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds());
    return this.getTime();
}

-1

まず文字列に変換してから、タイムゾーンテキストを置き換えます。

function convertUnixTime(time) {
  return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.