将UTC纪元转换为本地日期

2020/10/07 02:01 · javascript ·  · 0评论

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

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

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

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

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

有什么建议么?

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

很简单,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)

纪元时间是从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;
   }
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}

将当前纪元时间(以[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小时制的地方的(随机)选择,它不是您的时区!

@djechlin对以上答案的补充

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

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

大纪元时间(即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)接受答案中步骤,因为JavaScriptDate(value)构造函数采用UTC值(以毫秒为单位)(而不是本地时间)。

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

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

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

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

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

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

如果您希望在没有诸如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();

自己看看

编辑

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

编辑固定

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

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

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

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

最简单的方法

如果您以毫秒为单位的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. 现在,您可以随意设置其格式。
本文地址:http://javascript.askforanswer.com/jiangutcjiyuanzhuanhuanweibendiriqi.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!