私は今しばらくこれと戦っています。 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以下の非常に小さな違いを私に与えているだけで、それはミリ秒単位です。
助言がありますか?
私はもっと簡単な解決策があると思います - 最初の日付を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);
d
はFri Feb 13 2009 18:31:30 GMT-0500 (EST)
に設定された日付です(私のタイムゾーンで)
それは簡単です、new Date()
は数ミリ秒かかるだけです。
new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)
そしてログだけで、 Moment.js ライブラリを使用してフォーマットしました。
moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)
function ToLocalDate (inDate) {
var date = new Date();
date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
return date;
}
エポック時間は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;
}
@djechlinによる上記の回答への追加
d = '1394104654000';
new Date(parseInt(d));
エポック時間を人間が読める日付に変換します。そのタイプのエポック時間は整数でなければならないことを忘れないでください。
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);
[ミリ秒]の現在のエポック時間を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時間表記の場所の単なる(ランダムな)選択です。それはあなたのタイムゾーンではありません!
私がこれを見つけた最も簡単な解決策は、次のとおりです。
var timestamp = Date.now(), // returns milliseconds since Epoch time
normalisedTime = new Date(timestamp);
これはnew Date(timestamp)
ステートメントの最後に* 1000
がないことに注意してください(これは私にとってとにかく!)常に間違った日付を与えるように見える、すなわち2019年を与える代わりに51015として年を与えるので、ただマインド。
エポック時間(すなわち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(...)
コンストラクタの使用は避けてください。これはお勧めできません(上記のリンクを参照)。
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>
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を修正
@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();
}
考えてみると、あなたは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