处理 UTC 日期客户端

Handling UTC dates client side

情况如下:

我的数据库中存储了 occurred_at 个 UTC 日期。我正在使用 laravel 编写一个 API 方法,该方法 returns 记录包含这些 occurred_at 字段。它们目前通过 JSON 以字符串格式返回(PHP Carbon 库输出的内容),例如:

"occurred_at":"2015-04-14 00:25:20" 此日期 "occurred" 在 UTC 时区 00:25 (12:25 AM),但实际上在太平洋 (PST) 时区 2015-04-13 17:25 (5:25 PM)。

我正在使用 angular 来使用 JSON,并认为我会使用 angular-moment 库将 UTC 转换为本地时间。但它不起作用。 angular-moment 和原生 angular 过滤器输出相同的东西:

<span>{{evt.occurred_at | amDateFormat:'L LT'}}</span> <span>{{evt.occurred_at | date:'MM/dd/yyyy @ h:mma'}}</span>

输出:

2015-04-14 00:25:20

仍在 UTC。在我的 angular 应用程序代码中,我什至设置了 UTC 预处理器以将它们读取为 UTC,但它们不显示为本地时间:

.constant('angularMomentConfig', { preprocess: 'utc' })

必须有一个标准的方法来解决这个问题——将日期时间值以 UTC 格式存储在数据库中,但将它们显示为本地时间给用户。我需要在服务器端做一些改变吗?客户端?使用 "it just works" 方法的最佳做法是什么,而无需为我想显示的每个日期编写大量代码?

目前,在非 angular 项目中,我正在使用我认为是 'hack' 的东西,方法是将 css class 应用于我想要的每个跨度将时间转换为本地时间:

$('.utc-dttm').each(function () {
    var t = moment.utc($(this).text()).local();
    $(this).text(t.format("L") + ' ' + t.format("LT"));
});

但我认为这是错误的处理方式。

你不能再做一个为你腾出时间的功能吗? 喜欢,先搞定函数,节省时间:

localStorage.setItem('time', +new Date);

要转换它:

function toTimeZone(time, zone) {
var format = 'YYYY/MM/DD HH:mm:ss ZZ';
return moment(time, format).tz(zone).format(format);

}

当你想取回它时:

new Date(parseInt(localStorage.getItem('time')));

来源:Convert date to another timezone in JavaScript + Store Date and Retrieve from Local Storage

由于有效的 JSON 日期时间字符串被格式化为 ISO-8601 格式,您应该让 Carbon 将日期值转换为这种格式,然后再通过 toIso8601String 返回给客户端,例如:

$occurred_at->toIso8601String();

这会将日期字符串输出为

2015-04-14T00:25:20Z

哪个 javascript 和任何日期扩展库应该在本地解析为 UTC 时区,并在输出给用户时调整到客户端时区。