在Luxon中使用特定格式将字符串格式化为Datetime

问题描述

现在,我使用moment-js进行时间处理,但是我想切换到Luxon。但是我在以下实现上遇到问题。

一个文本字段,您可以在其中输入语言环境时间格式的日期时间,例如HH:mm(24h格式)或hh:mm(12h格式)。使用的时间格式存储在变量timeFormat中。

我对moment-js解决方案:

let timeFormat = 'HH:mm' // 'hh:mm a'
let textfield = document.querySelector('#input-time');
let timeString = textfield.value;
let dateTime = moment(timeString,timeFormat,true);

// Check if time is valid
if(dateTime.isValid() === false){
    return;
}

使用12h格式:

  • 11:00 am09:43 pm 有效
  • 11:0021:43 无效

使用24h格式:

  • 11:00 am09:43 pm 无效
  • 11:0021:43 有效

我如何证明可以使用Luxon获得类似的解决方案?我最大的问题是要获得与moment(timeString,true)类似的功能,因此请使用特定格式(例如12h / 24格式)将String格式化为Datetime。

解决方法

您可以使用fromFormat方法

根据输入字符串和格式字符串创建DateTime。如果未指定语言环境,则默认为en-US,与系统的语言环境无关。

示例:

const DateTime = luxon.DateTime;
const inputs = ['11:00 am','09:43 pm','11:00','21:43'];
const formats = ['HH:mm','hh:mm a'];

const checkTime = (timeString,fmt) => 
  DateTime.fromFormat(timeString,fmt).isValid


for (i=0; i<inputs.length; i++) {
  for (j=0; j<formats.length; j++) {
    console.log(`${inputs[i]} with format '${formats[j]}' is valid? ` + checkTime(inputs[i],formats[j]) );
  }
}
<script src="https://cdn.jsdelivr.net/npm/luxon@1.25.0/build/global/luxon.js"></script>

请参阅手册的For Moment users部分,以获取有关从momentjs迁移到Luxon的良好参考。