将UTC时代转换为本地date

我现在一直在为此而战。 我试图将时代转换为date对象。 这个时代以UTC发送给我。 每当你通过new Date()一个时代,它就认为它是本地时代。 我试图创build一个UTC对象,然后使用setTime()将其调整到适当的时期,但唯一有用的方法是toUTCString()和string不帮助我。 如果我将该string传递给新的date,它应该注意到它是UTC,但它不。

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

我的下一个尝试是试图获得本地当前时代和UTC当前时代之间的差异,但我无法得到这一点。

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

这只是给我很小的差异,在1000以下,这是毫秒。

有什么build议么?

我想我有一个更简单的解决scheme – 将初始date设置为纪元,并添加UTC单位。 假设您有一个以秒为单位存储的UTC时代var。 1234567890怎么样 将其转换为本地时区中的适当date:

 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现在是一个date(在我的时区)设置为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日返回毫秒 ,所以如果你有一个纪元时间戳,把它转换成一个JavaScript时间戳乘以1000。

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

你只是要求将UTCstring转换为“本地”string? 你可以这样做:

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

编辑

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

编辑固定

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

我知道这是一个古老的问题,但在客户端,date的困难仍然是一样的。 如果您更喜欢parsingUTC和本地时间的时间戳和date转换,而不使用像moment.js这样的库,请查看下面的选项。

对于使用UTC时间戳的应用程序,您可能需要在考虑当地时区和日光的情况下在浏览器中显示date(如果适用)。 即使在相同的时区,编辑夏时制不同的date也是非常棘手的。

下面的NumberDate扩展允许您在时间戳的时区显示和获取date。 例如,假设您在温哥华,如果您正在编辑七月份或十二月份的date,可能意味着您正在编辑PST或PDT中的date。

我build议你检查下面的代码片段来testing这个解决scheme。

毫秒的转换

 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转换

 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="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> 

考虑到,你有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