通过忽略时区将 JSON DateTime 对象解析为 JQuery 中的本地时间

Posted

技术标签:

【中文标题】通过忽略时区将 JSON DateTime 对象解析为 JQuery 中的本地时间【英文标题】:Parse JSON DateTime object to local time in JQuery by ignoring timezone 【发布时间】:2018-03-09 04:58:30 【问题描述】:

我在使用 moment 解析 JSON Date Time 对象时遇到了一个问题(当然,我尝试了 *** 中建议的许多方法,但在我的情况下没有任何效果)。

在我的应用程序中,我将 DateTime 值存储为 UTC DateTime。现在,当我显示时,我需要根据浏览器时区显示它。在经历了许多 *** 问题后,我使用了“moment.js”,如下所示

//From server, the Date object looks like /Date(1506510057813)/ 
//The equivalent DateTime value stored in Database is 2017-09-27 13:00:57.813
fuction DateTimeFormatter(value)
    
    if (value != undefined) 
        var newValue = new Date(moment.utc(value));

        //But at this line, even with just moment(value) all I am getting is DateTime which is not same as UTC time.
        //I don't want any time zone to get appended all I want is just 13:00:57

        var newHours = newValue.getHours() - newValue.getTimezoneOffset() / 60;
        var newMinutes = (newHours + '.0').split('.')[1] * 6;

        newValue.setHours(newHours);
        newValue.setMinutes(newMinutes);

        return moment(newValue).format(applicationTableDateFormat);
     
    else
        return "";

请让我知道我做错了什么,或者有没有其他方法可以根据浏览器时区显示时间。

【问题讨论】:

您是否可以将格式从服务器更改为标准日期,例如 ISO 2017-09-27T18:39:03.076Z?这样您甚至不必解析日期。 【参考方案1】:

一旦有了 UTC 时刻,您就可以将其转换为本地时间。

moment.utc(value).local().format(...)

https://momentjs.com/docs/#/manipulating/local/

但听起来你真正的问题可能是你存储日期的时间。如果您将其存储为 UTC,请确保在存储之前将本地值实际转换为 UTC。这样,当您阅读它时,您会得到一个可预测的值,您可以安全地将其转换为任何语言环境。

【讨论】:

我存储它只有UTC时间。【参考方案2】:

Angularjs 有它自己的机制来在视图上显示格式化的日期,你只需要一个日期的绝对表示,剩下的就交给它了。我的意思是绝对的Date,无论它是否是UTC,你都需要知道你在说什么时区。

The date filter

它是来自 angularjs 核心模块的过滤器,它接受:

"... 作为日期对象、毫秒(字符串或数字)或各种 ISO 8601 日期时间字符串格式(例如 yyyy-MM-ddTHH:mm:ss.sssZ 及其较短的版本,如 yyyy-MM- ddTHH:mmZ, yyyy-MM-dd 或 yyyyMMddTHHmmssZ)。如果输入的字符串中没有指定时区,则认为时间是本地时区。" (Angularjs date filter)

问题

Angularjs 需要正确的日期输入才能正确显示它,在您的情况下,您似乎具有毫秒格式(有点,/Date(1506510057813)/),您可以使用它并提取数字部分并在管道上输入,或者您可以更改服务器以发送 ISO 8601 日期(又名,yyyy-MM-ddTHH:mm:ss.sssZ)。

例如:

let rawDate = '/Date(1506510057813)/';
let re = /\/Date\((\d+)\)\//g; // regex to extract number from the string date

let myDate = new Date(Number(re.exec()[1])) // extract the milliseconds

或者

let rawDate = '2017-09-27T11:00:57.813Z'; 
let myDate  = new Date(rawDate)// and you don't need to do anything else

无论哪种方式,你都会得到这样的结果:

<span>  myDate | date </span>

【讨论】:

以上是关于通过忽略时区将 JSON DateTime 对象解析为 JQuery 中的本地时间的主要内容,如果未能解决你的问题,请参考以下文章

DateTime.ParseExact,忽略时区

如何在忽略时区问题的情况下从 SQL Server 获取 DateTime 数据?

Grails 无法将 JSON 中的日期/时间解组回 joda DateTime

转换没有时区的 JSON 日期

检查 pandas 中的 datetime 对象是不是有时区?

Django:如何让 datetime 对象知道创建它的时区?