web-dev-qa-db-ja.com

UTC Epochから現地の日付に換算

私は今しばらくこれと戦っています。 Epochを日付オブジェクトに変換しようとしています。エポックはUTCで私に送られます。 new Date()にEpochを渡すたびに、それはローカルのEpochであると見なします。 UTCオブジェクトを作成してからsetTime()を使用して適切なEpochに調整しようとしましたが、便利な唯一の方法はtoUTCString()であり、文字列は役に立ちません。その文字列を新しい日付に渡すと、それがUTCであることに気付くはずですが、そうではありません。

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

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

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

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

助言がありますか?

236
Shane Reustle

私はもっ​​と簡単な解決策があると思います - 最初の日付をEpochに設定し、UTC単位を追加します。 UTC Epoch varが秒単位で格納されているとします。 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);

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

414
user1030503

それは簡単です、new Date()は数ミリ秒かかるだけです。

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

そしてログだけで、 Moment.js ライブラリを使用してフォーマットしました。

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)
29
Gus
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}
16
chris

エポック時間は1970年1月1日からです。date.getTime()は1970年1月1日からミリ秒を返すので、 Epochのタイムスタンプがある場合は、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;
   }
16
logic8

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

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

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

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
ZagNut

[ミリ秒]の現在のエポック時間を24時間に変換します。 disable 12-hour formatにオプションを指定する必要があるかもしれません。

$ 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時間表記の場所の単なる(ランダムな)選択です。それはあなたのタイムゾーンではありません!

2
not2qubit

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

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

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

2
Rob P

エポック時間(すなわちUnixエポック時間)は、ほとんどの場合、1970年1月1日00:00:00(UTC時間)以降に期限切れになったsecondsの数であり、ミリ秒ここでの答えのいくつかは暗示しています。

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

したがって、Unix Epochの時間値が与えられている場合、それはおそらく秒単位で、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();

JavaScriptのd.setUTCMilliseconds(0)コンストラクタはUTCの値をミリ秒単位で取るので(ローカルタイムではありません)、受け入れられた回答でDate(value)ステップを実行する必要はありません。

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

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

2
garryp

Moment.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();

自分で見てください

// Extending Number

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;
};

// Extending Date

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

// Getting the demo to work
document.getElementById('m-to-local-button').addEventListener('click', function () {
  var displayElement = document.getElementById('m-to-local-display'),
      value = document.getElementById('m-to-local').value,
      milliseconds = parseInt(value);
  
  if (typeof milliseconds === 'number')
    displayElement.innerText = (milliseconds).toLocalDate().toISOString();
  else
    displayElement.innerText = 'Set a value';
}, false);

document.getElementById('m-to-utc-button').addEventListener('click', function () {
  var displayElement = document.getElementById('m-to-utc-display'),
      value = document.getElementById('m-to-utc').value,
      milliseconds = parseInt(value);
  
  if (typeof milliseconds === 'number')
    displayElement.innerText = (milliseconds).toUTCDate().toISOString();
  else
    displayElement.innerText = 'Set a value';
}, false);

document.getElementById('date-to-utc-button').addEventListener('click', function () {
  var displayElement = document.getElementById('date-to-utc-display'),
      yearValue = document.getElementById('date-to-utc-year').value || '1970',
      monthValue = document.getElementById('date-to-utc-month').value || '0',
      dayValue = document.getElementById('date-to-utc-day').value || '1',
      hourValue = document.getElementById('date-to-utc-hour').value || '0',
      minuteValue = document.getElementById('date-to-utc-minute').value || '0',
      secondValue = document.getElementById('date-to-utc-second').value || '0',
      year = parseInt(yearValue),
      month = parseInt(monthValue),
      day = parseInt(dayValue),
      hour = parseInt(hourValue),
      minute = parseInt(minuteValue),
      second = parseInt(secondValue);
  
  displayElement.innerText = new Date(year, month, day, hour, minute, second).getUTCTime();
}, false);
<link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.11/semantic.css" rel="stylesheet"/>

<div class="ui container">
  <p></p>
  
  <h3>Milliseconds to local date</h3>
  <input id="m-to-local" placeholder="Timestamp" value="0" /> <button id="m-to-local-button">Convert</button>
  <em id="m-to-local-display">Set a value</em>

  <h3>Milliseconds to UTC date</h3>
  <input id="m-to-utc" placeholder="Timestamp" value="0" /> <button id="m-to-utc-button">Convert</button>
  <em id="m-to-utc-display">Set a value</em>
  
  <h3>Date to milliseconds in UTC</h3>
  <input id="date-to-utc-year" placeholder="Year" style="width: 4em;" />
  <input id="date-to-utc-month" placeholder="Month" style="width: 4em;" />
  <input id="date-to-utc-day" placeholder="Day" style="width: 4em;" />
  <input id="date-to-utc-hour" placeholder="Hour" style="width: 4em;" />
  <input id="date-to-utc-minute" placeholder="Minute" style="width: 4em;" />
  <input id="date-to-utc-second" placeholder="Second" style="width: 4em;" />
  <button id="date-to-utc-button">Convert</button>
  <em id="date-to-utc-display">Set the values</em>
  
</div>
1
Darlesson

EDIT

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を修正

1
Amjad Masad

@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();
}
0
Walf

考えてみると、あなたは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
apurva.nandan