Получить данные о времени Flatpickr в формате Unix - PullRequest
0 голосов
/ 17 октября 2018

Я использую Flatpickr для нескольких требований к дате и времени в проекте, управляемом React.В частности, я использую библиотеку React со вкусом React-flatpickr .

. Она работает нормально, и при использовании ее для полей даты или времени, предоставляющих автономные данные, проблем не возникает.

В моем требовании есть средство выбора даты, где пользователь выбирает дату, используя представление календаря по умолчанию.

Два дополнительных связанных поля позволяют пользователю выбрать время начала и время окончания.Эти 2 поля показывают только выбор времени - нет просмотра календаря.

В опциях, помимо других данных, передается dateFormat K, так как я хочу, чтобы время моей обработки в Unix было временем, а представление, возвращаемое пользователю, может иметь более дружественные форматы.Это отлично работает для поля даты.Поля времени должны возвращать время на основе эпохи Unix для дня, выбранного в поле даты.Я получаю одну цифру (например, 6), когда передаю K для полей времени.Если я правильно понимаю, поля времени получают дату из опций defaultDate или value.

Образец макета прилагается для некоторой визуальной ссылки:

A rough layout of the date and 2 time fields

Как получить время Unix для этих полей времени на основедата выбрана в поле даты?Например, я ищу эти значения:

  • дата начала: 123456789009 (время выборки из поля 'startdate', в идеале время 00:00:00 AM в формате эпохи Unix)
  • startime: 98765432236 (время выборки из поля 'starttime', дата основана на поле 'startdate' с временем, выбранным в этом поле. По умолчанию будет установлено время эпохи Unix для 06:00:00 AM, если ноль)
  • endtime: 934236111833 (время выборки из поля 'endtime', дата основана на поле 'startdate' с временем, выбранным в этом поле. По умолчанию будет время эпохи Unix для 11:59:59PM, если ноль)

Мой код незавершенной работы / грубый код React: (Примечание: некоторые элементы и классы и т. Д., Которые использовались для макета и стиля, были удалены для краткости, чтобы обеспечить улучшенную читаемость. IЯ использую 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>
    )
}

}

1 Ответ

0 голосов
/ 18 октября 2018

Я думаю, что, возможно, я разместил вопрос, не пытаясь на самом деле найти несколько более вероятных решений - я только что познакомился с библиотекой и поставил вопрос в течение часа, так как знал, что онлайн-ресурсов пока не будет слишком много (Я попробовал несколько вариантов, но подумал, что, возможно, в моем подходе не было необходимой фундаментальной модификации, которая не была задокументирована).

Несколько изменений в моем коде, и я смог решить свою основную проблему.

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 атрибута также удалил (возможно временно) свойства minTime и maxTime
  • , обеспечивающие полночное время в состоянии для начальной даты

Есть несколько проблем, которыми я являюсьно, по крайней мере, я решил свои основные проблемы.

Для этого проекта я активно стараюсь урезать размер файла настолько, насколько это возможно, поэтому мой первый автоматический выбор решения, основанного на моментах (библиотеках), вышел,Я действительно думал о Luxon и Date-fns, но FlatPickr привлек мое внимание, так как он не имеет зависимостей и уже содержит встроенный сборщик (на самом деле это решение для выбора даты / времени, ориентированное на сборщик), и если необходимость когда-либо возникала, имеет поддержку локали какЧто ж.Предварительно созданный компонент React-ready также помог в принятии решений.

...