通过忽略时区将 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 "";
请让我知道我做错了什么,或者有没有其他方法可以根据浏览器时区显示时间。
【问题讨论】:
您是否可以将格式从服务器更改为标准日期,例如 ISO2017-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 中的本地时间的主要内容,如果未能解决你的问题,请参考以下文章
如何在忽略时区问题的情况下从 SQL Server 获取 DateTime 数据?
Grails 无法将 JSON 中的日期/时间解组回 joda DateTime