JavaScript «новая дата» создает дату со временем, отличным от исходной строки даты

1

Я получаю дату в виде строки '2018-10-15 00:00:00.000', а затем конвертирует ее в дату с использованием new Date('2018-10-15 00:00:00.000').

Я сохраняю эту дату в базе данных (с API) и сохраняю данные как 2018-10-15 **04**:00:00.000. Обратите внимание на время 4 часа. API получает дату с 4:00 утра.

Изображение 174551

В моем угловом приложении объект, который содержит эту дату, определяется как тип Date.

meeting_date: Date;

Это из консоли.

dt = new Date('2018-10-15 00:00:00.000')
Mon Oct 15 2018 00:00:00 GMT-0400 (Eastern Daylight Time)

JSON.stringify(dt)
""2018-10-15T04:00:00.000Z""

Я хочу сохранить дату как 2018-10-15 00:00:00.000. Что я делаю неправильно?

  • 3
    это зависит от вашего часового пояса db / server и локали, вместо этого сохраните временную метку
  • 2
    Добро пожаловать в кошмар, который в кодах - Даты и Времена. Проблема почти наверняка заключается в разнице часовых поясов в браузере, на веб-сервере и в базе данных. Если вы используете метку времени UTC, то эта проблема должна разрешиться сама собой.
Показать ещё 1 комментарий
Теги:
datetime

1 ответ

2
Лучший ответ

Если полученная строка ввода даты представляет собой UTC, то вы, вероятно, захотите создать объект Date в UTC (ваш текущий подход - создание объекта Date по местному времени на клиентском компьютере, поэтому смещение EDT влияет на Date время, которое вы хранят в вашей БД). Кроме того, вы должны знать, что Date() не рекомендуется для разбора строк дат из-за несоответствий браузера.

Ниже приведен пример использования некоторого простого регулярного выражения для анализа строки и создания объекта Date в UTC:

const inputDate = '2018-10-15 00:00:00.000';
let [y, m, d, hh, mm, ss, ms] = inputDate.match(/\d+/g).map(x => parseInt(x));
let date = new Date(Date.UTC(y, m - 1, d, hh, mm, ss, ms));

console.log(JSON.stringify(date));

// date as UTC string
console.log(date.toUTCString());

// date as local string
console.log(date.toString());
  • 0
    Голосование за: let [y, m, d, hh, mm, ss, ms] = inputDate.match(/\d+/g); Я никогда не видел этого раньше, но человек, который делает работу со строками даты легко!
  • 1
    @AdamH - это полезно для таких строк даты. Строки с альфа-месяцами и т. Д. Должны обрабатываться немного по-другому.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню