将UTC Epoch转换为本地日期

我已经为此挣扎了一段时间。我正在尝试将epoch转换为日期对象。纪元以UTC格式发送给我。当你给new Date()传递一个epoch时,它假定它是本地epoch。我尝试创建一个UTC对象,然后使用setTime()将其调整为适当的epoch,但唯一有用的方法是toUTCString()和字符串对我没有帮助。如果我将这个字符串传递给一个新的日期,它应该注意到它是UTC,但它没有。

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

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

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

它只给了我非常小的差别,在1000以下,单位是毫秒。

有什么建议吗?

571863 次浏览

编辑

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

编辑固定

您只是要求将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);

@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并添加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)

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

对于日志,我使用Moment.js库来实现,无论如何,我都使用它来格式化。

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

这很简单,new Date()只需要几毫秒,例如:

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

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

如果您更喜欢解析时间戳和日期从UTC和本地时间到UTC和本地时间的转换,而不需要像moment.js这样的库,请查看下面的选项。

对于使用UTC时间戳的应用程序,您可能需要在浏览器中显示日期,考虑到当地时区和夏令时(如果适用)。编辑不同夏令时的日期(即使是在同一时区)可能会很棘手。

下面的NumberDate扩展允许你在时间戳的时区中显示和获取日期。例如,假设你在温哥华,如果你在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>

将当前以[ms]为单位的epoch时间转换为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小时格式的地方的(随机)选择,它不是你的时区!

除了上面@djechlin的回答

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

将EPOCH时间转换为人类可读的日期。只是不要忘记,EPOCH时间类型必须是整数。

纪元时间(即Unix纪元时间)几乎总是自1970年1月1日00:00: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(...)构造函数,这是不推荐的(参见上面的链接)。

我找到的最简单的解决方法是:

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

注意,在new Date(timestamp)语句的末尾没有* 1000,因为这个(至少对我来说!)似乎总是给出错误的日期,即给出的年份不是2019年而是51015年,所以请记住这一点。

var myDate = new Date( your epoch date *1000);

来源- https://www.epochconverter.com/programming/#javascript

最简单的方法

如果unix纪元以毫秒为单位,在我的例子中是1601209912824

  1. 将其转换为日期对象
const dateObject = new Date(milliseconds)
const humanDateFormat = dateObject.toString()

输出-

Sun Sep 27 2020 18:01:52 GMT+0530 (India Standard Time)
  1. 如果您想要UTC -的日期
const dateObject = new Date(milliseconds)
const humanDateFormat = dateObject.toUTCString()
  1. 现在你可以根据自己的喜好来设置格式了。