如何使用 moment js 比较时区转换后 javascript 中的时间跨度

How to compare timespan in javascript after timezone conversion using moment js

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

对于时区转换,我需要临时日期。所以我选择当前的UTC日期 moment.utc(我的时间跨度)。并通过 .tz("CST").

进行时区转换

所以list被转换为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;
});

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

几件事:

  • A "time span" 通常指的是 duration 的时间,而不是一天中的某个时间。这是两个截然不同的概念,有时会混淆。考虑:

    • 99 小时的时间跨度完全有效,但“99:00”作为一天中的时间是荒谬的。
    • 由于夏令时和其他时区转换,时间跨度不一定被认为是 "time since midnight",因为午夜可能存在也可能不存在,或者一天中的其他时间可能不存在或重复。
    • 在某些编程语言中,时间跨度可以是负数,通常表示给定时间点之前的一段时间。
  • 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 小时。