情况如下:
我的数据库中存储了occurred_at
个日期。我使用laravel编写一个返回包含这些occurred_at
字段的记录的API方法。它们目前通过JSON以字符串格式(PHP Carbon库输出)返回,例如:
"occurred_at":"2015-04-14 00:25:20"
这个日期"发生了#34;在UTC时区的00:25
(12:25 AM
),但实际上在太平洋(PST)时区的2015-04-13 17:25
(5: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"));
});
但我认为这是错误的方式。
答案 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