我可以使用 Luxon 将 DateTime 与时间字符串组合起来吗?

aar*_*ona 6 javascript typescript reactjs luxon

我有一个TimePicker以这种格式返回 24 小时时间的组件:09:00上午 9 点、12:00中午 12 点或20:00晚上 8 点。我的代码中的某些内容需要Date(JSDate),因此我只想获取当前日期/时间,但应用具有事件的组件DateTime.now()中的小时和分钟。我可以像这样处理该事件:TimePickeronClick

// TimePickerValue can either be a string or JSDate
// but the TimePicker is always returning a string
const handleTimeChange = (time:TimePickerValue) => {
  // this outputs a time in 24-hour format
  console.log("handleTimeChange: ", time) 
    
  // I want to set the state of the parent component
  // this needs to be in JSDate format so this doesn't work
  // setSomeValue(time)

  // Because I don't care about date, I can just use "now()" and convert
  // it to a JSDate but I want the hours and minutes of the value I'm setting
  // to be the time in the string being sent to this function.
  setSomeValue(DateTime.now().toJSDate())
}
Run Code Online (Sandbox Code Playgroud)

Luxon 能否解析类似“13:00”的内容或将其应用到现有的内容DateTime,以便覆盖其现有的hoursand minutes

ger*_*rod 8

Luxon 可以解析类似“13:00”的内容吗

是的,您可以使用该fromISO方法来解析时间字符串

const parsed = DateTime.fromISO('20:00');
console.log(parsed.toString());  // 2021-04-07T20:00:00.000+10:00
Run Code Online (Sandbox Code Playgroud)

Luxon 能否将其应用于现有的 DateTime,以便覆盖现有的小时和分钟?

这可能有点困难,我不知道 Luxon 是否有“内置”方法来做到这一点。但是,如果您使用 解析时间字符串fromISO,它会将日期部分设置为“今天”,因此您可以使用diff计算出“一天中的时间”(作为Duration),然后使用它来设置您的一天中的时间其他日期:

const parsed = DateTime.fromISO(time);
const today = DateTime.now().startOf('day');
const timeOfDay = parsed.diff(today);

const dateToModify = DateTime.fromJSDate(otherDate);
const result = dateToModify.startOf('day').plus(timeOfDay);
Run Code Online (Sandbox Code Playgroud)

或者,如果您有时间的“部分”,您可以使用Luxon 的set方法来覆盖这些单独的部分:

const dateToModify = DateTime.fromJSDate(otherDate);

// Not sure what's in the 'TimePickerValue' object but if you had hours and minutes:
const result = dateToModify.set({
    hour: time.hours,
    minute: time.minutes,
});
Run Code Online (Sandbox Code Playgroud)