首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么无法识别moment.js中指定的使用字符串的时区参数?

为什么无法识别moment.js中指定的使用字符串的时区参数?
EN

Stack Overflow用户
提问于 2019-03-22 03:48:53
回答 1查看 1.3K关注 0票数 1

我正在尝试创建三个moment.js对象,一个用于当前用户的系统时间,两个用于同一天的地点开放和关闭时间。

首先,我创建了一个date对象,如下所示:

代码语言:javascript
复制
var today = moment();

然后我循环遍历一个对象数组:

代码语言:javascript
复制
        $(locations).each(function(){ 

                switch(this.time_zone) {
                case 'EST':
                zoneOffset = '-04:00';
                break;
                case 'CST':
                zoneOffset = '-05:00';
                break;
                case 'MST':
                zoneOffset = '-06:00';
                break;
                case 'PST':
                zoneOffset = '-07:00';
                break;
                default:
                zoneOffset = '-04:00';
                }

        var timeOpen = today.format("YYYY")+'-'+today.format("MM")+'-'+today.format("DD")+'T'+this.hours['d'+today.day()+'s']+zoneOffset;
        var timeClose = today.format("YYYY")+'-'+today.format("MM")+'-'+today.format("DD")+'T'+this.hours['d'+today.day()+'e']+zoneOffset;
        openingHrs = moment(timeOpen);
        closingHrs = moment(timeClose);
        console.log(this.id+' '+zoneOffset+' - '+openingHrs.format());

我有一个开关来检查每个位置的time_zone。当我通过控制台输出我的一个日期(openingHrs)时,结果总是偏移量-04,即使变量zoneOffset表明不是这样?我假设默认值是这样插入的:

代码语言:javascript
复制
48 -06:00 - 2019-03-21T10:00:00-04:00
49 -05:00 - 2019-03-21T08:30:00-04:00
50 -07:00 - 2019-03-21T11:00:00-04:00
51 -05:00 - 2019-03-21T09:00:00-04:00
52 -05:00 - 2019-03-21T09:00:00-04:00

这就是我在JSON中使用的:

代码语言:javascript
复制
"time_zone":"CST",
"hours":{
  "d1s":"08:00:00",
  "d1e":"17:00:00",
  "d2s":"08:00:00",
  "d2e":"17:00:00",
  "d3s":"08:00:00",
  "d3e":"17:00:00",
  "d4s":"08:00:00",
  "d4e":"17:00:00",
  "d5s":"08:00:00",
  "d5e":"17:00:00",
  "d6s":"00:00:00",
  "d6e":"00:00:00",
  "d7s":"00:00:00",
  "d7e":"00:00:00"
}

我有超过200个“地点”,每个地点都有不同的时间和时区。最终,我要做的是创建一个地图,这样无论用户是在纽约、洛杉矶,还是两者之间的某个地方,如果他们查看地图上的标记,我都希望它根据位置、时区等显示为开放或关闭。

EN

回答 1

Stack Overflow用户

发布于 2019-03-23 01:07:11

以下是一些事情:

  • 如果你的源文件只包含那些确切的缩写(ESTCSTMSTPST),那么你已经有了一个问题,因为你没有考虑到包含这些缩写的地区的夏令时,你也没有考虑到亚利桑那州(大部分地区是没有夏令时的MST ),而且你已经忘记了阿拉斯加和夏威夷,以及美国的任何地区。您应该更仔细地检查您的数据。
  • 如果您可以控制此源数据,则应完全避免使用时区缩写。相反,请使用an IANA time zone identifier。对于美国,感兴趣的主要标识符如下:

代码语言:javascript
复制
- `America/New_York` - Eastern Time (EST / EDT)
- `America/Chicago` - Central Time (CST / CDT)
- `America/Denver` - Mountain Time (MST / MDT)
- `America/Phoenix` - Mountain Time (MST only)
- `America/Los_Angeles` - Pacific Time (PST / PDT)
- `America/Anchorage` - Alaskan Time (AKST / AKDT)
- `America/Adak` - Hawaii-Aleutian Time (HAST / HADT)
- `Pacific/Honolulu` - Hawaii-Aleutian Time (HAST only)

(这份名单不包括关岛、波多黎各、美属萨摩亚等美国领土,但它们在更大的名单here上。)

  • 如果您无法控制数据,则将缩写映射到偏移量,而不是将它们映射到标识符。(同样,对于亚利桑那州和阿留申群岛,您将遇到一个问题,因为您不能仅通过缩写来消除歧义。)
  • 如果您有来自世界各地的数据,那么您真的不应该使用时区缩写。有太多的模棱两可的地方,比如CST --这可能意味着美国中央标准时间、澳大利亚中央标准时间、古巴标准时间或中国标准时间。(还有其他几个存在冲突。)
  • 您可以在Moment-TimezoneLuxon等库中使用IANA时区标识符。您不需要自己知道偏移量-它们几乎总是通过library.
  • It's提供的,这是一种将数据格式化为字符串的反模式,只是为了再次将其解析回对象。Moment让这一切变得更容易。例如:

moment.tz('08:00:00','HH:mm:ss',‘美国/芝加哥’).format() //=>在您的代码中,您假设本地时区的“今天”与目标时区中的“今天”相同。事实可能并非如此。假设你从世界的另一端运行代码。当在美国还是2019-03-22的时候,他们可能已经在使用2019-03-23了。如果您使用的是我在前面的要点中展示的代码,那么将为您处理automatically.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55288256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档