问题 用moment()更新时间偏移量.utcOffset()


我正面临一些试图使用的问题 moment.js 处理时间偏移。

我在隐藏的输入中收集本地用户时间偏移量:

<script type="text/javascript">
  $(document).ready(function () { 
    $('input#timeoffset').val(moment().utcOffset()); 
  });
</script>

偏移量得到正确存储(在我的情况下,其值为-240)。稍后在服务器端(在utc时间运行)我尝试更新一些db存储的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 moment-timezone.js v0.4.0和moment.js v2.10.6


4796
2017-10-01 01:42


起源

你做了什么 userDate 申请抵消后?你可能正在打电话 toDate, valueOf, unix,或反映瞬间而不是墙壁时间的其他方法。 - Matt Johnson
另外,请记住“时区!=偏移”。如果您存储用户的 当前 偏移并稍后将其应用于任意时间点,它很可能是那个时间的错误偏移。时区可以更改夏令时的偏移,以及其他各种原因。 - Matt Johnson
@MattJohnson其实我只是 .format(...) 打印出结果。我上面报告的结果是打印的: console.log('utcDate: ' + moment(utcDate).format('YYYYMMDD HHmmss ZZ')); console.log('userDate: ' + moment(utcDate).utcOffset(offset).format('YYYYMMDD HHmmss ZZ'));。该 utcDate 是没有抵消。 - Pierluigi


答案:


主要问题是您将偏移量作为字符串而不是数字传递。

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(...) 哪个会使用 本地 时区除非时区是明确的或您通过了 Date 对象而不是字符串。它也将离开 moment 对象在“本地模式”,所以你的 utcDate 除非机器的时区实际设置为UTC,否则输出将是错误的。

最后,不要忘记“时区!=偏移”。您不能假设您获得的偏移量对所有日期都有效。如果您需要将日期投影到用户的时区,您必须实际知道时区,例如 America/New_York。你可以将它们与moment-timezone插件一起使用。


16
2017-10-01 17:49



我只是想通了,这正是我的错误,我没有 parseInt 而我感到困惑的是它在一个方向而不是在另一个方向上工作 offset 是一根绳子!谢谢! - Pierluigi