Как получить явное время после выбора даты в Material UI KeyboardDatePicker

#reactjs #uidatepicker

#reactjs #uidatepicker

Вопрос:

Когда я выбираю дату в календаре, она возвращает мне нужную дату, но с текущим временем. Вот пример вывода после выбора случайного дня в семь часов: «Вт, 01 декабря 2020 года, 19:28:00 GMT 0200 (восточноевропейское стандартное время)». Я хочу, чтобы он возвращал мне 00:00:00, как это происходит, когда я сам записываю дату во ввод, не выбирая ее в календаре.

Вот фрагмент кода для выбора даты:

 <MuiPickersUtilsProvider utils={DateFnsUtils}>
      <KeyboardDatePicker
        className="search-element"
        disableToolbar
        variant="inline"
        format="dd/MM/yyyy"
        id="date-picker-inline"
        label="пошук від"
        value={firstDate}
        onChange={handleFirstDateChange}
        KeyboardButtonProps={{
          'aria-label': 'set first date',
        }}
      />
 

Комментарии:

1. Посмотрите на DateFormatter

2. какие утилиты даты вы используете?

3. Я использую @date-io/date-fns

Ответ №1:

Средства выбора даты материала всегда будут указывать текущие часовые секунды часового пояса вашего браузера, у меня с этим много проблем, но вы всегда можете сделать

 import React from "react";

export default function YourComponent() {
 const [firstDate, setFirstDate] = React.useState(null)

 const handleFirstDateChange = (date) => {
  const newDate = date;
  // Check if date is present, user can leave it as an empty field
  if (date) {
   //Set's the given date to UTC midnight (start of the day)
   newDate.setUTCHours(0,0,0,0);
  }
  // Set the date to your local state or where you are storing it
  setFirstDate(newDate)
 }

 return (
   <KeyboardDatePicker
    className="search-element"
    disableToolbar
    variant="inline"
    format="dd/MM/yyyy"
    id="date-picker-inline"
    label="пошук від"
    value={firstDate}
    onChange={handleFirstDateChange}
    KeyboardButtonProps={{
      'aria-label': 'set first date',
    }}
   />
 )
}
 

Это позволит использовать дату начала дня по UTC, вы также можете использовать setHours, но для этого будет использоваться часовой пояс вашего браузера, который может отличаться в зависимости от местоположения пользователя.

Я бы также предложил использовать библиотеку Luxon и утилиты luxon вместо date-fns, если вашим требованиям нужен определенный часовой пояс (это то, что я в итоге сделал).

Комментарии:

1. О Боже, проблема с часовым поясом выводит меня из себя. Теперь мне нужно отправить 23:59:59 на серверную часть, и у меня 2, у моего календаря проблемы с отображением. Когда я выбираю 01/12, отображается 02/12, потому что для моего браузера время равно 02:00:59 из 02/12, а не 23:59 из 01/12. Как я должен использовать luxon для этого? Он возвращает объект, а не строку. Может быть, вы можете дать совет?

2. Эй, с luxon вы получите объект DateTime, который является пользовательским объектом из их библиотеки, они позволяют сильно изменять объект, поэтому, например, если вы хотите, чтобы ваша дата была в конце дня, вы должны сделать что-то вроде date.endOf(‘day’), посмотрите на это: moment.github.io/luxon/docs/class/src /…

3. Но имейте в виду, что вам также следует ввести часовой пояс, если вы хотите, чтобы приложение всегда отправляло одну и ту же дату, например, пользователь с восточным временем в браузере сохранит другую дату, чем пользователь с центральным стандартным часовым поясом, поэтому, если вы хотите ввести определенный часовой пояс, вам следует изменитьобъект luxon, проверьте последний раздел этого: moment.github.io/luxon/docs/manual/zones

4. можете ли вы помочь с реализацией этого метода? Это не работает: const handleStartDateChange = date => { const newDate = date if (date) { newDate.endOf('day').toISO(); } setStartDate(newDate) }

5. вы внесли все изменения для поддержки luxon? вам нужно добавить библиотеку плюс утилиты для сборщиков mui, если это добавлено, я думаю, вы сможете ее использовать, каков вывод console.log (date)?