获取 Unix 格式的 Flatpickr 时间数据

Get Flatpickr time data in Unix format

我正在使用 Flatpickr for a few date and time requirements in a React-driven project. Specifically i am using the React flavoured library React-flatpickr

它工作正常,当我将它用于提供独立数据的日期或时间字段时没有任何问题。

我的要求有一个日期选择器,用户可以在其中使用默认日历视图选择日期。

另外两个相关字段允许用户选择开始时间和结束时间。这 2 个字段仅显示时间选择 - 没有日历视图。

在选项中,除了其他数据,dateFormat 被传递 K 因为我想要 Unix 纪元时间用于我的处理,而视图 returned 给用户可能有更友好的格式。这适用于日期字段。时间字段应 return 返回日期字段中所选日期的基于 Unix 纪元的时间。当我为时间字段传递 K 时,我得到一个数字(例如 6)。如果我的理解是正确的,时间字段会从 defaultDatevalue 选项中获取日期。

附上示例布局以供参考:

如何根据日期字段中选择的日期获取这些时间字段的 Unix 时间?例如,我正在寻找这些值:

我的work-in-progress/rough反应代码: (注意:为简洁起见,删除了一些用于布局和样式的元素和 类 等,以确保增强可读性。我正在使用 Redux,所以可能根本没有使用本地状态。本地状态就是这样我可以得到一个工作版本。)

class SelectDateTime extends React.Component{
   state={
      startdate: new Date().getTime(),
      starttime: "",
      endtime: "",
   }
   startDateChanged=(date)=>{
    this.setState({
        ...this.state,
        startdate: date
    })
   }
   startTimeChanged=(time)=>{
    this.setState({
        ...this.state,
        starttime: time
    })
  }
  endTimeChanged=(time)=>{
    this.setState({
        ...this.state,
        endtime: time
    })
  }
  render(){
    const { startdate, starttime, endtime } = this.state;
    return(
        <React.Fragment>
          <div>
             Start Date
             <Flatpickr                 
                 value={startdate}
                 options={{
                        wrap: true,
                        minDate: 'today',
                        altInput: true, 
                        altFormat: "F j, Y",
                        dateFormat: "U"
                    }}
                    onChange={date => { this.startDateChanged(date) }} 
                >
                <input type='text' data-input />
                <button type='button' data-toggle>Select</button>
            </Flatpickr>
          <div>
            Start Time
            <Flatpickr                 
                value={starttime}
                options={{
                    wrap: true,
                    enableTime: true,
                    noCalendar: true,
                    //dateFormat: "H:i",
                    altInput: true,
                    altFormat: "H:i K",
                    dateFormat: "U",
                    defaultDate: startdate,
                    minDate: "06:00",
                    maxDate: "23:59"
                }}
                    onChange={time => { this.startTimeChanged(time) }} 
                >
                <input type='text' data-input />
                <button type='button' data-toggle>Select</button>
            </Flatpickr>
          </div>
          <div>
             End Time
            <Flatpickr                 
                value={startdate}
                //value={endtime}
                options={{
                    wrap: true,
                    enableTime: true,
                    noCalendar: true,
                    altInput: true,
                    altFormat: "H:i K",
                    dateFormat: "U",
                    defaultDate: "startdate",
                    minDate: "06:00",
                    maxDate: "23:59"
                }}
                onChange={time => { this.endTimeChanged(time) }} 
                >
                <input type='text' data-input />
                <button type='button' data-toggle>Select</button>
             </Flatpickr>
          </div>
        </React.Fragment>
    )
}

}

我想我可能没有真正尝试更多可能的解决方案就发布了问题 - 我刚刚熟悉图书馆并在一小时内提出问题,因为我知道不会有太多的在线资源然而(我确实尝试了一些选项,但认为我的方法可能缺少未记录的基本必需修改)。

对我的代码进行了一些更改,我能够解决我的主要问题。

state={
    startdate: Math.round((new Date()).setUTCHours(0,0,0,0)),
    starttime: null,
    endtime: null,
}


  <Flatpickr                 
    value={startdate}
    options={{
     wrap: true,
     minDate: 'today',
     altInput: true, 
     altFormat: "F j, Y",
     dateFormat: "U"
   }}
  onChange={date => { this.startDateChanged(date) }} 
  >
  /* ...other code here  */
 </Flatpickr>


 <Flatpickr
   key={startdate}
   options={{
    wrap: true,
    enableTime: true,
    noCalendar: true,
    altInput: true,
    altFormat: "H:i K",
    dateFormat: "U",
    defaultDate: startdate,
   }}
   onChange={time => { this.startTimeChanged(time) }} 
  >
  /* ...other code here  */
  </Flatpickr>

  <Flatpickr
   key={startdate}
   options={{
    wrap: true,
    enableTime: true,
    noCalendar: true,
    altInput: true,
    altFormat: "H:i K",
    dateFormat: "U",
    defaultDate: startdate,
   }}
   onChange={time => { this.endTimeChanged(time) }} 
  >
  /* ...other code here  */
  </Flatpickr>

主要变化包括:

  • 添加 key 属性使时间字段能够获取状态中的变化
  • 删除了 value 属性以及(可能暂时)删除了 minTimemaxTime 属性
  • 在开始日期的州实施午夜时间

我正在解决一些问题,但至少我解决了主要问题。

对于这个项目,我主动尝试 trim 尽可能减小文件大小,所以我的第一个自动选择 Moment(库)驱动的解决方案被淘汰了。我确实想到了 Luxon 和 Date-fns,但 FlatPickr 引起了我的注意,因为它没有依赖项并且已经内置了一个选择器(实际上它是一个以选择器为中心的 date/time 解决方案)并且如果需要的话有语言环境也支持。拥有一个预构建的 React-ready 组件也有助于决策。