1

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

对于时区转换,我需要临时日期。所以我通过moment.utc(mytimespan)选择当前的UTC日期。并通过 .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;
});

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

4

1 回答 1

2

一些东西:

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

    • 99 小时的时间跨度完全有效,但“99:00”作为一天中的时间是荒谬的。
    • 由于夏令时和其他时区转换,时间跨度不一定被认为是“从午夜开始的时间”,因为午夜可能存在也可能不存在,或者一天中的其他时间可能不存在或重复。
    • 在某些编程语言中,时间跨度可能是负数,通常表示给定时间点之前的一段时间。
  • Moment.js 中的tz函数采用IANA 时区名称。例如,您不应使用CTor CST,而应使用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 小时分开。
于 2018-12-03T19:18:23.197 回答