我在EDT,我的最终用户在PDT。我希望我的WebApp能像在最终用户的时区运行一样运行(例如,即使他们旅行,也会显示回家的时间)。来自Java服务器的时间戳被格式化为包括最终用户的时区,例如"Mon Oct 27 06:57:00 PDT 2014",我在配置文件中也有最终用户的TZ字符串,例如"America/VVancouver"。我使用的是native 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");
Fiddle:http://jsfiddle.net/up628qbq/
谢谢!
在格式字符串中使用小写z
,而不是大写Z
。这将与时区缩写字符相匹配。
请注意,这实际上不会将缩写解释为特定的偏移量。这主要是因为缩写词可能不明确。("CST"有5种不同的含义)。因此,DST回退转换期间的某些值可能会被错误解释。
例如,在太平洋时区,有两个2014年11月2日凌晨1:00的实例。第一个是PDT(-7),第二个是PST(-8)。即使您提供了缩写,moment也不会用它来消除歧义。如果您想确定正在使用哪个实例,则需要包含一个数字时区偏移量,并使用Z
进行解析。
此外,您可以使用ddd
作为工作日名称,而不是拆分和切片。
谢谢马特!我没有足够的声誉来"投票支持",所以我做了你建议的修改(删除split
并添加ddd
格式,将Z
更改为z
):http://jsfiddle.net/up628qbq/1/