在最终用户中操作's时区与momentjs

Operating in the end user's timezone with momentjs

本文关键字:时区 momentjs 用户 操作      更新时间:2023-09-26

我在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/