将 UTC Epoch 转换为本地日期

IT技术 javascript date utc epoch
2021-01-27 11:55:41

我一直在与这个斗争一段时间。我正在尝试将纪元转换为日期对象。时代以UTC格式发送给我。每当您通过new Date()一个纪元时,它都会假定它是本地纪元。我尝试创建一个 UTC 对象,然后使用setTime()它来将其调整到正确的时代,但似乎唯一有用的方法是toUTCString()字符串对我没有帮助。如果我将该字符串传递给一个新日期,它应该注意到它是 UTC,但它不是。

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

我的下一次尝试是尝试获取本地当前纪元和 UTC 当前纪元之间的差异,但我也无法得到它。

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

它只给我很小的差异,低于 1000,以毫秒为单位。

有什么建议?

6个回答

我想我有一个更简单的解决方案——将初始日期设置为纪元并添加 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)

var d = new Date(1234567890000) 返回相同的结果
2021-03-18 11:55:41
@muttonUp,经过 1000 次乘法,它起作用了。但是,“Y39K 问题”谷歌没有给出任何有效的结果。任何 URL 都会有帮助
2021-03-21 11:55:41
FWIW,Date 对象可以以毫秒为单位进行初始化。所以,var d = new Date(utcSeconds * 1000)应该产生相同的结果。
2021-03-24 11:55:41
1234567890000 的处理方式与 1234567890 相同,也就是 Y39K 问题...
2021-03-26 11:55:41
想也许其他人可以从几点中得到一些清晰度:日期对象没有设置“标记在其中”的时区。把它想象成一个数字。该数字是自 1970 年 1 月 1 日UTC 到现在(现在也在UTC 中)的毫秒数。因此,无论何时创建日期对象,它都在幕后使用 UTC。2.要显示该日期,您可以将其显示为语言环境设置(toLocaleString(),或者,在UTC中(toUTCString())。您不需要自己转换任何东西。使用utc毫秒构建,一切都好。构建与字符串 - 只要它在本地时区。
2021-04-04 11:55:41

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

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)
这个对我不起作用,当你有时间戳时它有效,但使用 utc epoch 你必须手动设置 utcseconds,接受答案是正确的答案
2021-03-21 11:55:41
这是一个合适的答案。新日期可能需要几毫秒,因此只需乘以 1000: const d = new Date(epoch * 1000)
2021-04-06 11:55:41
@sameerali 也许您的系统有一些不同的问题,或者您感到困惑。这个答案是正确答案。Unix 纪元的定义:自 UTC 1 月 1 日午夜以来经过的秒数只需乘以 1000 即可获得经过的毫秒数。
2021-04-06 11:55:41
好东西!这应该被视为真正被接受的答案。
2021-04-08 11:55:41

就日志而言,我使用Moment.js完成了这项工作,无论如何我都使用它进行格式化。

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)
Moment 很好,但是使用 1.3MB 的库将一个 epoch 转换为日期是很疯狂的。难怪有这么多臃肿的节点应用程序。
2021-03-14 11:55:41
我的意思是,他确实明确指出他正在使用它进行格式化。在这里说不公平。
2021-03-20 11:55:41

纪元时间是从 1970 年 1 月 1 日开始的秒数date.getTime()返回1970 年 1 月 1 日起的毫秒数,因此..如果您有纪元时间戳,请将其乘以 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在日期解析方面。谢谢!
2021-03-22 11:55:41
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}
你让我今天一整天都感觉很好。泰。我只是用加号代替了我的工作的减号。
2021-03-30 11:55:41