处理UTC日期客户端

时间:2015-04-14 01:26:48

标签: javascript php angularjs momentjs angular-moment

情况如下:

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

"occurred_at":"2015-04-14 00:25:20" 这个日期"发生了#34;在UTC时区的00:2512:25 AM),但实际上在太平洋(PST)时区的2015-04-13 17:255:25 PM)。

我使用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格式存储日期时间值,但将它们显示为用户的本地时间。我是否需要在服务器端进行一些更改?客户端?什么是使用&#34的最佳实践;它只是工作&#34;方法,没有为我想要显示的每个日期写一大堆代码?

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

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

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

2 个答案:

答案 0 :(得分:1)

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

$occurred_at->toIso8601String();

这会将日期字符串输出为

2015-04-14T00:25:20Z

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

答案 1 :(得分: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')));

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