使用 moment().utcOffset() 更新时间偏移
Updating time offset with moment().utcOffset()
我在尝试使用 moment.js
处理时间偏移时遇到了一些问题。
我在隐藏输入中收集本地用户时间偏移量:
<script type="text/javascript">
$(document).ready(function () {
$('input#timeoffset').val(moment().utcOffset());
});
</script>
偏移量被正确存储(在我的例子中它的值为-240)。稍后在服务器端(UTC 时间 运行s)我尝试更新一些数据库存储的 utcDate 做类似的事情:
var userDate = moment(utcDate).utcOffset(offset)
我的问题如下:
如果我 运行 我的代码如上所述,我没有任何效果:
utcDate: 20151001 012421 +0000
userDate: 20151001 012421 +0000
如果我翻转偏移符号,我得到:
utcDate: 20151001 012421 +0000
userDate: 20151001 052421 +0400
我显然做错了什么(即使我的期望是第一个版本是正确的),你有什么提示吗?
在客户端我使用 moment.js v2.10.6 而在服务器端时刻 - timezone.js v0.4.0 和 moment.js v2.10.6
主要问题是您将偏移量作为字符串而不是数字传递。
moment.utc("2015-10-01 01:24:21").utcOffset("-240").format('YYYYMMDD HHmmss ZZ')
// "20151001 012421 +0000"
moment.utc("2015-10-01 01:24:21").utcOffset(-240).format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"
如果您有分钟偏移量,则必须使用数字形式。您可以随时转换它:
moment.utc("2015-10-01 01:24:21").utcOffset(+"-240").format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"
Moment 确实允许将偏移量作为字符串传递,但它希望它们采用 ISO8601 格式之一:[+/-]HH:mm
或 [+/-]HHmm
.
moment.utc("2015-10-01 01:24:21").utcOffset("-04:00").format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"
此外,请注意我使用 moment.utc(...)
来解析输入字符串。您刚刚使用了 moment(...)
,它将使用 local 时区,除非时区是明确的或者如果您传递 Date
对象而不是字符串。它还会将 moment
对象留在 "local mode" 中,因此除非计算机的时区实际设置为 UTC,否则您的 utcDate
输出将是错误的。
最后,别忘了"Time Zone != Offset"。您不能假设您获得的偏移量对所有日期都有效。如果您需要将日期投影到用户的时区,则必须实际知道时区,例如 America/New_York
。您可以将它们与 moment-timezone 插件一起使用。
我在尝试使用 moment.js
处理时间偏移时遇到了一些问题。
我在隐藏输入中收集本地用户时间偏移量:
<script type="text/javascript">
$(document).ready(function () {
$('input#timeoffset').val(moment().utcOffset());
});
</script>
偏移量被正确存储(在我的例子中它的值为-240)。稍后在服务器端(UTC 时间 运行s)我尝试更新一些数据库存储的 utcDate 做类似的事情:
var userDate = moment(utcDate).utcOffset(offset)
我的问题如下: 如果我 运行 我的代码如上所述,我没有任何效果:
utcDate: 20151001 012421 +0000
userDate: 20151001 012421 +0000
如果我翻转偏移符号,我得到:
utcDate: 20151001 012421 +0000
userDate: 20151001 052421 +0400
我显然做错了什么(即使我的期望是第一个版本是正确的),你有什么提示吗?
在客户端我使用 moment.js v2.10.6 而在服务器端时刻 - timezone.js v0.4.0 和 moment.js v2.10.6
主要问题是您将偏移量作为字符串而不是数字传递。
moment.utc("2015-10-01 01:24:21").utcOffset("-240").format('YYYYMMDD HHmmss ZZ')
// "20151001 012421 +0000"
moment.utc("2015-10-01 01:24:21").utcOffset(-240).format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"
如果您有分钟偏移量,则必须使用数字形式。您可以随时转换它:
moment.utc("2015-10-01 01:24:21").utcOffset(+"-240").format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"
Moment 确实允许将偏移量作为字符串传递,但它希望它们采用 ISO8601 格式之一:[+/-]HH:mm
或 [+/-]HHmm
.
moment.utc("2015-10-01 01:24:21").utcOffset("-04:00").format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"
此外,请注意我使用 moment.utc(...)
来解析输入字符串。您刚刚使用了 moment(...)
,它将使用 local 时区,除非时区是明确的或者如果您传递 Date
对象而不是字符串。它还会将 moment
对象留在 "local mode" 中,因此除非计算机的时区实际设置为 UTC,否则您的 utcDate
输出将是错误的。
最后,别忘了"Time Zone != Offset"。您不能假设您获得的偏移量对所有日期都有效。如果您需要将日期投影到用户的时区,则必须实际知道时区,例如 America/New_York
。您可以将它们与 moment-timezone 插件一起使用。