将UTC Epoch转换为本地日期

Sha*_*tle 253 javascript date utc epoch

我现在一直在与此斗争.我正在尝试将纪元转换为日期对象.这个时代以UTC的形式发送给我.每当你通过new Date()一个时代,它就会认为它是本地的时代.我尝试创建一个UTC对象,然后使用setTime()它调整到适当的纪元,但唯一有用的方法是toUTCString()和字符串不能帮助我.如果我将该字符串传递给新的日期,它应该注意到它是UTC,但事实并非如此.

new Date( new Date().toUTCString() ).toLocaleString()
Run Code Online (Sandbox Code Playgroud)

我的下一次尝试是尝试获取当地当前时期和UTC当前时期之间的差异,但我也无法得到它.

new Date( new Date().toUTCString() ).getTime() - new Date().getTime()
Run Code Online (Sandbox Code Playgroud)

它只给了我很小的差异,低于1000,这是毫秒.

有什么建议?

小智 432

我想我有一个更简单的解决方案 - 将初始日期设置为纪元并添加UTC单位.假设您有一个UTC纪元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);
Run Code Online (Sandbox Code Playgroud)

d 现在是一个日期(在我的时区)设置为 Fri Feb 13 2009 18:31:30 GMT-0500 (EST)

  • FWIW,Date对象可以用毫秒初始化.因此,`var d = new Date(utcSeconds*1000)`应该产生相同的结果. (164认同)
  • `var d = new Date(1234567890000)`返回相同的结果 (46认同)
  • 想到也许其他人可以从几个点得到一些清晰度:日期对象没有设置时间区"加盖".把它想象成一个数字.该数字是自1970年1月1日UTC到现在(现在也是UTC)的毫秒数.因此,无论何时创建日期对象,它都是在幕后的UTC中.2.要显示该日期,您可以将其显示为语言环境设置(toLocaleString(),或者以UTC(toUTCString())显示.您不需要自己转换任何内容.使用utc millisec构建,一切都很好.构造与字符串 - 只要它在当地时区. (10认同)
  • 1234567890000 的处理方式与 1234567890 相同,也就是 Y39K 问题... (4认同)
  • @muttonUp,1000 次乘法就可以了。但是,“Y39K问题”谷歌没有给出任何有效的结果。任何URL都会有帮助 (2认同)

dje*_*lin 211

它很容易,new Date()只需要几毫秒,例如

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个恰当的答案.新日期可能需要几毫秒,因此只需乘以1000:`const d = new Date(epoch*1000)`. (9认同)
  • 好一个!这应该被认为是真正的公认答案. (5认同)
  • @sameerali 也许您的系统遇到了一些不同的问题,或者您感到困惑。这个答案是正确答案。Unix 纪元的定义:*自 UTC 1 月 1 日午夜以来经过的秒数*。只需乘以 1000 即可得到经过的毫秒数。 (2认同)

Gus*_*Gus 29

而对于日志,我使用Moment.js库来完成此操作,无论如何我都使用它来进行格式化.

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

  • 我的意思是,他确实指定他正在使用它进行格式化。在这里这么说并不公平。 (3认同)
  • Moment 很好,但是使用一个 1.3MB 的库来将一个 epoch 转换为一个日期是很疯狂的。难怪有这么多臃肿的节点应用程序。 (2认同)

log*_*ic8 17

纪元时间是从1970年1月1日开始的秒数.从1970年1月1日起date.getTime()返回毫秒数.所以..如果你有一个纪元时间戳,请将它转换为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;
   }
Run Code Online (Sandbox Code Playgroud)


小智 16

 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}
Run Code Online (Sandbox Code Playgroud)


ALD*_*ENT 10

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

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


gar*_*ryp 7

Epoch time (i.e. Unix Epoch time) is nearly always the number of seconds that have expired since 1st Jan 1970 00:00:00 (UTC time), not the number of milliseconds which some of the answers here have implied.

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

Therefore, if you have been given a Unix Epoch time value it will probably be in seconds, and will look something like 1547035195. If you want to make this human readable in JavaScript, you need to convert the value to milliseconds, and pass that value into the Date(value) constructor, e.g.:

const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();
Run Code Online (Sandbox Code Playgroud)

您不需要执行已d.setUTCMilliseconds(0)接受答案中的步骤,因为 JavaScriptDate(value)构造函数采用以毫秒为单位的UTC值(不是本地时间)。

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

另请注意,您应该避免使用Date(...)采用字符串日期时间表示的构造函数,这是不推荐的(请参阅上面的链接)。


小智 6

最简单的方法

如果你有以毫秒为单位的unix纪元,就我而言 -1601209912824

  1. 将其转换为日期对象,如下所示
const dateObject = new Date(milliseconds)
const humanDateFormat = dateObject.toString() 
Run Code Online (Sandbox Code Playgroud)

输出 -

Sun Sep 27 2020 18:01:52 GMT+0530 (India Standard Time)
Run Code Online (Sandbox Code Playgroud)
  1. 如果您想要 UTC 格式的日期 -
Sun Sep 27 2020 18:01:52 GMT+0530 (India Standard Time)
Run Code Online (Sandbox Code Playgroud)
  1. 现在您可以随意格式化它。


not*_*bit 5

以 [ms] 为单位将当前纪元时间转换为 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
Run Code Online (Sandbox Code Playgroud)

或作为 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
Run Code Online (Sandbox Code Playgroud)

注意:en-GB这里的使用,只是一个(随机)选择一个使用 24 小时格式的地方,它不是你的时区!


Sar*_*oev 5

除了@djechlin 的上述答案之外

d = '1394104654000';
new Date(parseInt(d));
Run Code Online (Sandbox Code Playgroud)

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


小智 5

我发现的最简单的解决方案是:

var timestamp = Date.now(), // returns milliseconds since epoch time
    normalisedTime = new Date(timestamp);
Run Code Online (Sandbox Code Playgroud)

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