0

情况如下:

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

"occurred_at":"2015-04-14 00:25:20" 该日期“发生”于 UTC 时区的00:25( 12:25 AM),但实际上发生在太平洋2015-04-13 17:25( 5:25 PMPST) 时区的 ( )。

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

<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。在我的角度应用程序代码中,我什至设置了 UTC 预处理器以将它们读取为 UTC,但它们不显示为当地时间:

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

必须有一种标准的方法来解决这个问题 - 在数据库中以 UTC 存储日期时间值,但将它们显示为本地时间给用户。我需要在服务器端进行一些更改吗?客户端?使用“它只是工作”方法的最佳实践是什么,而不为我要显示的每个日期编写大量代码?

目前,在非角度项目中,我通过将 css 类应用于我想将时间转换为本地时间的每个跨度来使用我认为是“黑客”的东西:

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

但我认为这是错误的做法。

4

2 回答 2

1

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

$occurred_at->toIso8601String();

这会将日期字符串输出为

2015-04-14T00:25:20Z

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

于 2015-04-14T04:47:49.207 回答
0

你不能只做另一个为你争取时间的功能吗?比如,首先获取节省时间的功能:

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

来源:在 JavaScript + Store Date中将日期转换为另一个时区并从本地存储中检索

于 2015-04-14T01:33:12.157 回答