【问题标题】:Return date and time in ("YYYY-MM-DD HH:mm") format when using moment.js (timezone)使用 moment.js(时区)时以 ("YYYY-MM-DD HH:mm") 格式返回日期和时间
【发布时间】:2016-11-03 15:10:17
【问题描述】:

我正在使用时刻时区,因此我可以从选定的时区转换为客户端的时区。

我无法以比这更好的方式实现它:

convertSelectedTimeZoneToClients() {
    let timeZoneInfo = {
        usersTimeZone: this.$rootScope.mtz.tz.guess(),
        utcOffset: this.formData.timeZone.offset,
        selectedDateTime: this.toJSONLocal(this.formData.sessionDate) + " " + this.formData.sessionTime 
    };

    let utcTime = this.$rootScope.mtz.utc(timeZoneInfo.selectedDateTime).utcOffset(timeZoneInfo.utcOffset).format("YYYY-MM-DD HH:mm");
    let convertedTime = this.$rootScope.mtz.tz(utcTime, timeZoneInfo.usersTimeZone).format("Z");
    return convertedTime;
}

所以基本上我使用usersTimeZone: this.$rootScope.mtz.tz.guess(),guess() 函数从浏览器中找出时区。 然后我从日期时间选择器和下拉列表中获取值,并使用 utcOffset 将它们转换为 UTC 值。 最后,我想将该 utc 值转换为用户时区值。

我得到这样的对象:

_d 表示转换后的正确值。我尝试在 convertTime 变量上添加一堆不同的 .format() 模式,但我无法以这种格式检索时间:“YYYY-MM-DD HH:mm”。我猜它的工作方式与使用 .utcOffset() 函数时不同。

谁能帮我解决这个问题?

【问题讨论】:

  • 使用moment时的一般规则:所有以_开头的属性(如_d)都用于internal use,不应使用。请注意,您显示的代码与屏幕截图中的代码不同。最后,我认为了解toJSONLocal 返回的内容可能很有用(timeZoneInfo.selectedDateTime 的值是多少?)

标签: javascript angularjs datetime timezone momentjs


【解决方案1】:

您无需猜测客户端时区即可转换为本地时间。只需使用local 函数即可。

例如:

moment.tz('2016-01-01 00:00', 'America/New_York').local().format('YYYY-MM-DD HH:mm')

对于位于太平洋时区的用户,这会从东部转换为太平洋,并且您会得到一个输出字符串 "2015-12-31 21:00"。对于其他时区的用户,输出会有所不同,正如预期的那样。

您不需要格式化为字符串并重新解析它,或者手动操作 UTC 偏移量。这几乎是毫无根据的。

【讨论】:

  • 感谢您的回答。还有一个问题。当我传递这个值时:'America/New_York' 我怎样才能找到它?这就是我使用 .guess() 的原因,只是为了找出用户的时区。 @MattJohnson
  • 我不明白你在问什么。在我给出的示例中,America/New_Yorksource 时区 - 给定值为“in”的时区。你不会想去猜,否则整个事情都不会发生。
猜你喜欢
  • 2015-10-08
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
相关资源
最近更新 更多