2016-04-23 3 views
2
console.log(new Date('2016-05-24').toISOString()); // '2016-05-24T00:00:00.000Z' 
console.log(new Date('05/26/2016').toISOString()); // '2016-05-23T23:00:00.000Z' // why? 

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

Каков самый простой способ конвертировать дату в строку как '2016-05-24T00: 00: 00.000Z' в обоих случаях?

Благодаря

+1

Вы знаете, что это две разные даты, не так ли? Один из них - 24 мая, один - 26 мая. (Это не источник ошибки.) – Ben

+0

Возможный дубликат [Почему Date.parse дает неверные результаты?] (Http://stackoverflow.com/questions/2587345/why-does-date-parse-give- неверные-результаты) – Ben

+0

, который является только опечаткой ... – user1153896

ответ

2
console.log(new Date('2016-05-24 GMT').toISOString()); // '2016-05-24T00:00:00.000Z' 
console.log(new Date('05/24/2016 GMT').toISOString()); // '2016-05-24T00:00:00.000Z' 

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

Ваш код использовал разные временные интервалы для каждого разбора из-за способа форматирования дат. Один использовал + часовой пояс времени, другой использовал -1 часовой пояс, поэтому дата была отброшена назад, когда была создана строка ISO.

+0

Наверное, лучше, чем мой ответ - определенно более чистый, но пользователь может не знать часовой пояс , – Ben

+1

Это работает отлично. спасибо – user1153896

0

Используйте GetDate(), getMonth() и getFullYear() методы, чтобы вырезать то, что вам нужно.

+0

ну, это не то, что я ищу. Я считаю, должен быть лучше. В противном случае мне пришлось бы добавить «0», если getDate() <10 и т. Д. – user1153896

1

Один синтаксический разбор в UTC, один раз по местному времени.

new Date('2016-05-24').toISOString() // '2016-05-24T00:00:00.000Z' 
new Date('05/24/2016').toISOString() // '2016-05-24T07:00:00.000Z' 

Игра вокруг, вот одно решение:

new Date(new Date('05/24/2016') - (new Date()).getTimezoneOffset() * 60000).toISOString() // '2016-05-24T00:00:00.000Z' 

Стратегия:

  • Создание нового смещения даты
  • Вычесть смещение
  • Создать новую дату от этого

Справочные ссылки:


При дальнейшем рассмотрении, я рекомендовал бы разборе строку даты в то, что является "универсальным" перед передачей его в конструктор даты. Что-то вроде:

var tmp = ('05/24/2016').split('//'); 
var universal = [tmp[2], tmp[0], tmp[1]].join('-'); // 2016-05-24 
... 

Кроме того, Moment.js делает этот вид вещи очень аккуратно.

+0

console.log (новая дата (новая дата ('01/24/2016 ') - (новая дата()). GetTimezoneOffset() * 60000) .toISOString()).Мне нужен универсальный способ преобразования строки -> date -> toISOFormat – user1153896

+0

Я рекомендую сначала разбор строки со слэшами, чтобы получить ее в формате «универсальный», прежде чем передавать его в конструктор даты. – Ben

+0

Мне нужно время, чтобы быть «00: 00: 00.000Z» и дата «yyyy-MM-dd», и он должен работать на все даты. Образец не работает для других дат (например, console.log (новая дата (новая дата ('01/24/2016 ') - (новая дата()). GetTimezoneOffset() * 60000) .toISOString()) - -> 2016-01-24T01: 00: 00.000Z -> что не так) – user1153896

Смежные вопросы