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

j91ykkif  于 2023-04-13  发布在  TypeScript
关注(0)|答案(2)|浏览(95)

我有一个TimePicker组件,它以以下格式返回24小时时间:09:00用于9AM或12:00用于12 PM或20:00用于8 PM。我的代码中需要Date(JSDate),所以我想只使用当前日期/时间DateTime.now(),但应用来自TimePicker组件的小时和分钟,该组件具有onClick事件。我可以这样处理该事件:

// 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())
}

Luxon能否解析类似“13:00”的内容,或者将其应用于现有的DateTime,从而覆盖现有的hoursminutes

olmpazwi

olmpazwi1#

Luxon能解析出“13:00”这样的词吗
是的you can just use the fromISO method to parse a time string

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

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);

或者,如果你有时间的“部分”,你可以使用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,
});
ztmd8pv5

ztmd8pv52#

我也遇到了同样的问题。我目前正在使用Strapi并使用其Datepicker组件。该组件返回JSDate。

const ourTime = "17:34"
 // Parse time to object
 const { minute, hour } = DateTime.fromFormat(ourTime, 'hh:mm').toObject()

 const dt = DateTime.fromJSDate(dateFromComponent, { zone: 'gmt' })
 const inLocal = dt.toLocal().setZone('yourZone')
 console.log(inLocal, 'Our current date')

console.log 中的内容:*

const addedHoursAndMinutes = inLocal.set({ hour: hour, minute: minute })
 console.log(
     inLocal.set({ hour: hour, minute: minute }),  // Here is magic happens
     'Our current date with overwritten hours and mins'
 )

我们得到了想要的

简单回答:

可以在luxon的DateTime对象上使用.set({ hour: 17, minute: 34 })

  • P.S.* 不仅适用于小时和分钟。.set({years: 2001,months: 5,days: 5,hours: 0,minutes: 0,seconds: 0,milliseconds: 0})不要注意单词末尾的[s](小时/小时、天/天等-两种变体都适用)

相关问题