使用momentjs在最终用户的时区中操作

时间:2014-10-27 15:22:53

标签: javascript timezone timestamp momentjs timestamp-with-timezone

我在EDT,我的最终用户在PDT。我希望我的WebApp可以像在最终用户的时区中运行一样运行(例如,即使他们旅行它以显示回家的时间)。来自Java服务器的时间戳被格式化为包括最终用户的时区,例如“星期一10月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/

谢谢!

2 个答案:

答案 0 :(得分:1)

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

请注意,这实际上并未将缩写解释为特定偏移量。这主要是因为缩写可能不明确。 (There are 5 different meanings of "CST")。因此,DST fall-back transition期间的某些值可能会被错误地解释。

例如,在太平洋时区,有两个实例,即2014年11月2日凌晨1点。第一个是PDT(-7),第二个是PST(-8)。即使您提供了缩写,但赢了时使用它来消除歧义。如果您想确定使用的是哪个实例,则需要使用Z来包含和解析数字时区偏移量。

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

答案 1 :(得分:0)

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