处理 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 时区,并在输出给用户时调整到客户端时区。
情况如下:
我的数据库中存储了 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 时区,并在输出给用户时调整到客户端时区。