2015-06-08 4 views
1

Я пишу веб-приложение MVC 5. В этом случае у меня есть несколько списков, которые я распространяю и управляю с помощью javascript и jquery (один набор данных, зависимые элементы выбора и добавление обратных вызовов ajax будет осложнять его без необходимости.)Javascript Parsed Date

Проблема у меня есть: у меня есть скрытое поле отформатирован по ISO 8601. У меня возникают проблемы при отображении даты в локальном времени пользователя, я получаю сдвинутую дату.

Так что если дата указана как: 01-01-2009 (в iso 8601 формате: 2009-01-01), пользователь видит: 12-31-2008.

Когда я анализирую дату я использую:

this.date = new Date(Date.parse(originalString)); 
/* ^- Date.parse is giving me a number. */ 

Для отображения текста даты я использую:

admin.date.toLocaleDateString().Concat(... 

мне нужно сделать какой-либо патч-вверх делать настроить настройки в правильную часовую зону? Дата, когда используется console.log(admin.date); показывает оригинал 2009-01-01

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

Редактировать: Цель состоит в том, чтобы предотвратить смену даты. Все, что мы храним, - это дата, время отбрасывается. У нас есть несколько часовых поясов, отправляемых в эту базу данных, и цель такова: мы используем дату человека, который отправил его, время было сокращено. Был ли дата 1 мая 2015 года, я хочу, чтобы каждый, кто видит эту дату, чтобы увидеть май 01, 2015, «toLocaleDateString» - это просто средство, чтобы получить его формат для своего региона. Так что кто-то, кто рассматривает даты как yyyy-mm-dd, увидит его правильно.

+0

Ну, если опустить часы/минуты, они по умолчанию до полуночи. А полуночи, как мы знаем, происходят 24 раза в день (потому что время) ...Ваша местная полночь на 1 января, возможно, была полночь 31 декабря и т. Д. –

+0

просто прочитал API для этого метода: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString – pherris

+0

В зависимости от версии реализованного стандарта частичные строки даты ISO 8601 по умолчанию будут учитываться в часовом поясе UTC. [Из ES 5.1 - * Значение смещения отсутствующего часового пояса - «** Z **». *] (Http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15) Предшествующий стандарт ES 6 до сих пор изменил это на локальный часовой пояс пользователя. –

ответ

1

На основе документации для Date.parse:

Метод Date.parse() анализирует строковое представление даты и возвращает количество миллисекунд, прошедших с 1 января 1970 года, 00:00:00 UTC ,

Вы возвращаете время в UTC для вашей строки синтаксического анализа, поэтому почему дата отключена для местных времен. Таким образом, вы должны знать разницу во времени между местным временем и UTC, который Date.getTimezoneOffset обеспечивает (в минутах) для того, чтобы установить правильную дату по местному времени:

> var date = new Date(Date.parse('2009-01-01')); 
undefined 
> date; 
Wed Dec 31 2008 19:00:00 GMT-0500 (EST) 
> date.getTimezoneOffset(); 
300 
> date.setMinutes(date.getTimezoneOffset()); 
1230786000000 
> date; 
Thu Jan 01 2009 00:00:00 GMT-0500 (EST) 

Одно замечание, хотя это:

... смещение положительно, если местный часовой пояс находится за UTC и отрицательный, если он впереди.

Поэтому вам может потребоваться позаботиться о местах, где значение отрицательное, если это относится к вашему приложению. Если так, возможно, просто упущение отрицательных значений будет достаточно, поскольку дата должна быть одинаковой, если часовой пояс локали опережает полуночный UTC.

EDIT: Для компенсации возможных проблем при переходе на летнее время:

> var dateVals = String.prototype.split.call('2009-01-01', '-'); 
undefined 
> var date = new Date(dateVals[0], dateVals[1] - 1, dateVals[2]); 
undefined 
> date 
Thu Jan 01 2009 00:00:00 GMT-0500 (EST) 
+0

Я закончил с: 'this.date = new Date (date); var offsetDate = new Дата (86400000); offsetDate.setMinutes (offsetDate.getTimezoneOffset()); this.date = new Date (this.date.getTime() + offsetDate.getTime() - 86400000); 'Это должно обрабатывать отрицательные часовые пояса, правильно? –

+0

Ну, похоже, он не работает, работая над ним. Мое первоначальное решение имело часовой пояс, но в настройке моего собственного часового пояса до -840 минут я возвращаюсь туда, где я начал. –

+0

Я думаю, вы можете просто игнорировать отрицательные значения, так как это должно быть только за UTC (положительные значения), которые имели бы неправильную дату. –