如何使用Moment JS在时区转换后在JavaScript中比较时间跨度

时间:2018-12-03 06:15:13

标签: javascript timezone momentjs timespan moment-timezone

我有一个时间跨度列表(实际上是对象列表),例如2:00、15:00、18:00等,它在utc中。 现在,我想将此时隙转换回CST,然后对其进行排序,因为我希望我的时间在CST中排序。

对于时区转换,我需要一个临时日期。所以我选择当前的utc日期 moment.utc(mytimespan)。并通过.tz(“ CST”)执行时区转换。

因此列表被转换为20:00、9:00、12:00

请注意,我在列表中排在最后一位而不是第二位是20:00。 这是由于日期的一部分在回溯日期之后。

我想要的只是排序的时间跨度,不受日期影响。

请我找到一种无需字符串转换的方法!

谢谢

更新

我当前使用字符串转换的代码

TimeSpanDetails.sort(function compare(a, b) {
  return moment(moment.utc(a.startTime).tz("CST").format("HH:mm"),"HH:mm").isAfter(moment(moment.utc(b.startTime).tz("CST").format("HH:mm"),"HH:mm")) ? 1 : -1;
});

现在我想不使用格式进行字符串转换

1 个答案:

答案 0 :(得分:0)

几件事:

  • “时间跨度”通常是指时间的持续时间,而不是时间。这是两个非常不同的概念,有时会混淆。考虑:

    • 时间跨度为99小时是完全有效的,但是“ 99:00”对于一天中的某个时间而言是毫无意义的。
    • 由于夏时制和其他时区的转换,不一定将时间跨度视为“自午夜以来的时间”,因为午夜可能存在或不存在,或者一天中的其他时间可能不存在或重复。
    • 在某些编程语言中,
    • 时间跨度可以为,通常表示给定时间点之前的时间段。
  • Moment.js中的tz函数使用IANA time zone names。例如,您不应使用CTCST,而应使用America/Chicago。但是,时区与时间跨度完全无关,因此您根本不应该应用它们。您不需要时区。

  • 时刻表示Duration个对象中的时间跨度。您可以像这样从字符串中解析它们:

    var d = moment.duration('99:00');
    

    Duration对象将数值转换为毫秒,因此它们具有可比性,如下所示:

    var a = moment.duration('00:00');
    var b = moment.duration('01:00');
    var c = a < b;   //=> true
    
  • Moment在一天中的某个时间没有强类型对象,但是您可以在UTC模式下使用Moment,以便它没有DST转换,然后让它使用当天。 但是

    • 这将假定应在同一日期评估您拥有的所有时间值。 情况可能如此,也可能不是。
    • 请考虑一下,如果您所拥有的只是一天中的某天,并且不知道它们是什么日期,则值['23:00', '00:00']可能已经被排序并且相隔仅一个小时,或者乱序了,相距23小时。