#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)?