1

我在 EDT,我的最终用户在 PDT。我希望我的 WebApp 能够像在最终用户的时区运行一样运行(例如,即使他们旅行也是为了显示回家的时间)。来自 Java 服务器的时间戳被格式化为包含最终用户的时区,例如“Mon Oct 27 06:57:00 PDT 2014”,我还在配置文件中有最终用户 TZ 字符串,例如“America/Vancouver”。我正在使用本机 Date() 并且它为用户显示正确的时间,但我不能用它来比较时间和客户端中的时间。我希望更改为 moment.js,但我不知道如何让它做我想做的事。基本上,鉴于上述时间戳,我希望能够调用 m.hour() 并获得 6 回来。我还希望能够在最终用户时间中获得一年中的某一天(都是“现在” 和时间戳),并查看最后一个时间戳与当前时间的距离(以分钟为单位)。这是我失败的尝试:

var d = "Mon Oct 27 06:57:00 PDT 2014";
var ds = d.split(/ /).slice(1).join(' '); // eat "Mon "

var m = moment.tz(ds, "MMM D HH:mm:ss Z YYYY", "America/Vancouver");

alert("" + m.hour()); // 23 ???  Want "6"!

var n = moment.tz("America/Vancouver");
var df = n.diff(m, 'minute');
alert(m.format() + "\n" + n.format() +
      "\n" + df + " minutes ago");

小提琴:http: //jsfiddle.net/up628qbq/

谢谢!

4

2 回答 2

1

在格式字符串中使用小写z而不是大写Z。这将匹配时区缩写字符。

请注意,这实际上不会将缩写解释为特定的偏移量。这主要是因为缩写可能不明确。(“CST”有 5 种不同的含义)。因此,DST 回退转换期间的某些值可能会被错误地解释。

例如,在太平洋时区,2014 年 11 月 2 日凌晨 1:00 有两个实例。第一个在 PDT (-7) 中,第二个在 PST (-8) 中。即使您提供了缩写词,moment也不会使用它来消除歧义。如果您想确定您正在使用哪个实例,则需要包含一个数字时区偏移量并使用Z.

此外,您可以使用ddd工作日名称而不是拆分和切片。

于 2014-10-27T20:31:45.087 回答
0

谢谢马特!我没有足够的声誉来“投票”,所以我在小提琴中做了你推荐的更改(删除split并添加ddd格式,更改Z为):http: //jsfiddle.net/up628qbq/1/z

于 2014-10-28T12:12:03.503 回答