将UTC纪元转换为本地日期


273

我已经为此战斗了一段时间。我正在尝试将纪元转换为日期对象。时代以UTC发送给我。每当您经过new Date()一个纪元时,它就会假定它是本地纪元。我尝试创建一个UTC对象,然后使用setTime()它来将其调整为适当的纪元,但是唯一有用的方法是toUTCString()字符串对我没有帮助。如果我将该字符串传递给新日期,则应该注意它是UTC,但不是。

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

我的下一个尝试是尝试获取本地当前时间与UTC当前时间之间的差异,但是我也无法做到这一点。

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

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

有什么建议?


11
纪元时间定义为UTC中自1970年日期起经过的毫秒数。没有本地时代!不确定我了解您的问题。
Chetan Sastry

也许计算机上的时区不正确,导致UTC值不同?
kijin 2011年

2
如果要在使用toLocaleString()时“查看” UTC时间,则必须将时钟设置为UTC时间。UTC午夜是美国东部标准时间晚上7点。如果使用new Date()。toString()而不是localeString,则会得到类似“ Fri Jan 07 2011 07:00:00 GMT-0500”的信息,其中包括偏移量。
肯纳贝克

Answers:


463

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


189
FWIW,Date对象可以用毫秒初始化。因此,var d = new Date(utcSeconds * 1000)应产生相同的结果。
kurttheviking

54
var d = new Date(1234567890000)返回相同的结果
Matjaz Lipus 2014年

11
认为其他人可能会从以下两点得到一些澄清:date对象未设置带有“已标记”的时区。认为它只是数字。该数字是自1970年1月1日UTC到现在的毫秒数(现在也位于UTC中)。因此,无论何时创建日期对象,它实际上都是在后台的UTC中。2.要显示该日期,可以将其显示为语言环境设置(toLocaleString(),或使用UTC(toUTCString())。您无需自己进行任何转换。使用utc millisec构造,一切都很好。字符串-只要在当地时区即可
da Bich 2014年

2
1234567890000被视为与1234567890相同,也就是Y39K问题...
muttonUp

1
@muttonUp,可以进行1000次多行复制。但是,“ Y39K问题” google没有给出任何有效的结果。任何URL都将是有帮助的
P Satish Patro

237

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

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

6
好一个!这实际上应该被认为是公认的答案。
Nizar B.

这对我不起作用,它在有时间戳记的情况下有效,但是在使用utc时代时,您必须手动设置utcseconds,接受答案才是正确的答案
sameerali

12
这是一个适当的答案。新的日期可能由1000采取毫秒,因此只乘:const d = new Date(epoch * 1000)
–vinyl

@sameerali也许您的系统遇到了其他问题,或者感到困惑。这个答案是正确的答案。Unix时期的定义:自UTC 1月1日午夜以来经过的秒数。只需乘以1000,即可获得经过的毫秒数。
nalply

32

只是对于日志,我是使用Moment.js库完成的,无论如何我都使用它进行格式化。

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

1
瞬间不错,但是使用1.3MB的库只是将一个纪元转换为日期是很疯狂的。难怪那里有这么多肿的节点应用程序。
not2qubit

20

纪元时间是从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涉及到日期解析。谢谢!
GrayedFox

16
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}

1
你让我今天一整天都感觉很好。TY。我只是为我的工作将减号替换为加号。
Ludovic Kuty 2013年

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

或作为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小时制的地方的(随机)选择,它不是您的时区!


1
这是从Date方法获得任何类型的转换的最佳方法。谢谢!
SeaWarrior404 '18

我唯一不喜欢上述内容的是,它以不确定的格式返回日期,d/m/yyyy或者是m/d/yyyy?正确(最合乎逻辑)的显示方式应为:yyyy-mm-dd。有没有人?
not2qubit

4

大纪元时间(即Unix纪元时间)几乎总是数量自1970年1月1日00:00:00(UTC时间)已经过期的,而不是数毫秒其中一些在这里的答案已经暗示。

https://zh.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();

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

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

还要注意,您应该避免使用Date(...)带有字符串datetime表示形式的构造函数,不建议这样做(请参见上面的链接)。


3

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


3

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

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

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


2

如果您希望在没有诸如moment.js之类的库的情况下解决往返于UTC和本地时间的时间戳和日期转换,请查看以下选项。

对于使用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();

自己看看


这是实际答案。对我来说就像一个魅力。设置新日期(0)并添加milliSeconds与新日期(milliSeconds)相同
Jersey_Guy

1

编辑

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

编辑固定


我在第二个示例中经历了这一点。它给我的差异在50到900之间,以毫秒为单位(显示处理过程中的时间,而不是实际差异)
Shane Reustle 2011年

他们都没有帮助我。他们缺少一个setUTCTime方法,该方法非常完美:P w3schools.com/jsref/jsref_obj_date.asp
Shane Reustle 2011年

至少在适用于Ubuntu的Firefox上不起作用。代码不应在设置日期之后设置日/月/年。
西蒙·科兹洛夫

@Simon Kozlov实际上,多数民众赞成在日期对象中有一个错误的假设,setDate和getDate指的是当月的日期,问题是我使用了不存在的(setUTCDay)之类的函数,感到惊讶!
Amjad Masad 2011年

@AmjadMasad如果您还显示预期的输出,则您的答案会更有用。
not2qubit

0

考虑到您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


0

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

-1

首先将其转换为String,然后替换时区文本。

function convertUnixTime(time) {
  return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.