【问题标题】:Parsing ISO 8601 like duration in Luxon在 Luxon 中解析 ISO 8601 之类的持续时间
【发布时间】:2021-05-21 07:17:17
【问题描述】:

我的持续时间字符串看起来像:

1:16.352

1 是分钟部分,16 是秒部分,352 是毫秒部分。

我想使用Duration.fromISOTime,但我得到了:

{
  "reason": "unparsable",
  "explanation": "the input \"1:16.352\" can't be parsed as ISO 8601"
}

在 Luxon 中是否有一种干净的方式来解析此类持续时间?

【问题讨论】:

  • @OlegValter afaik Duration 没有这种方法
  • 抱歉,我误读了这个问题 - fromObject 方法怎么样?似乎您可以在一个点上拆分并使用这些值 - 还是您想找到一种直接接受自定义格式的方法?
  • 1:16.354 既不是有效的 ISO-8601 时间 (00:01:16.354) 也不是持续时间 (PT1M16.352S),并且不能像它一样被解析。

标签: javascript typescript duration luxon


【解决方案1】:

Duration.fromISOTime 不起作用,因为 1:16.352 不是 ISO 8601 时间字符串,缺少小时部分(请参阅 ISO 8601 Times)。

构建 Luxon Duration 对象的解决方法如下:

const DateTime = luxon.DateTime;
const Duration = luxon.Duration;

const startOfHour = DateTime.local().startOf('hour').toMillis();
const dt = DateTime.fromFormat("1:16.352", "m:ss.SSS"). toMillis();
const dur = Duration.fromMillis(dt - startOfHour);
console.log(dur.toFormat("m 'minute' s 'second' S 'millis'"));
<script src="https://cdn.jsdelivr.net/npm/luxon@1.26.0/build/global/luxon.js"></script>

【讨论】:

    【解决方案2】:

    与@VincenzoC 类似,我调整了我的输入string

    const Duration = luxon.Duration;
    
    var output;
    const durationInput = "1:16.352"
    
    if (durationInput.match(/:/g) || [].length === 1) {
      const semicolonLocation = durationInput.indexOf(":");
    
      if (semicolonLocation === 1) {
        output = "00:0" + durationInput;
      }
    
      if (semicolonLocation === 2) {
        output = "00:" + durationInput;
      }
    }
    
    console.log(Duration.fromISOTime(output));
    <script src="https://cdn.jsdelivr.net/npm/luxon@1.26.0/build/global/luxon.js"></script>

    【讨论】:

      【解决方案3】:

      正如我在 cmets 中提到的,您可以使用 fromObject 静态方法并简单地将输入拆分为 minutessecondsmilliseconds 配置选项。在您的情况下,一个简单的正则表达式 (\d+):(\d+)\.(\d+) 应该可以解决问题,不需要临时日期或规范化。

      const { Duration } = luxon;
      const durationInput = "1:16.352";
      
      const fromCustom = (input) => {
        const [, minutes, seconds, milliseconds ] = input.match(/(\d+):(\d+)\.(\d+)/);
          
        return Duration.fromObject({
          minutes, seconds, milliseconds
        });
      };
      
      console.log(fromCustom(durationInput));
      <script src="https://cdn.jsdelivr.net/npm/luxon@1.26.0/build/global/luxon.js"></script>

      【讨论】:

      • 只有一种情况正则表达式不起作用 - 1:16 没有毫秒部分
      • @pixel - 是的,很明显,我认为你的输入结构是稳定的?如果没有,那么这个默认为milliseconds(\d+):(\d+)(?:\.(\d+))? 应该绰绰有余了afaik
      猜你喜欢
      • 2014-07-16
      • 2014-08-16
      • 1970-01-01
      • 2010-11-11
      • 2022-01-18
      • 2021-02-16
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多