2017-02-21 2 views
0

Я делаю калькулятор рабочего дня, который принимает дату и смещение и возвращает дату. Поэтому, если вы пройдете его в понедельник, 27 февраля 2017 года и хотите узнать дату за 2 рабочих дня до ее возвращения в четверг, 23 февраля 2017. Также учитываются праздники, поэтому, если в предыдущем примере 23 февраля 2017 года Праздник он вернется 22 февраля 2017.Как остановить javascript от изменения моих дат?

У меня есть список праздников в SQL Server в поле даты в формате yyyy-mm-dd. Проблема заключается в том, что когда они преобразуются в объекты javascript Date, он добавляет смещение часового пояса, а в случае Восточного стандартного времени вычитает 5 часов с даты, возвращая его назад к предыдущему дню.

new Date('2017-02-20');

становится

Sun Feb 19 2017 19:00:00 GMT-0500 (Eastern Standard Time)

или

Sun Feb 19 2017 20:00:00 GMT-0400 (Eastern Daylight Time)

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

Как предотвратить javascript от испортить мои даты независимо от того, где живет пользователь? Меня интересуют только даты, а не времена.

+0

Использования https://momentjs.com/ и никогда больше не беспокоиться о паршивом объекте даты. – Slime

+0

JavaScript не является «бесполезным» здесь; он преобразует даты, которые вы передаете. Вам необходимо локализовать свое время, прежде чем хранить их. – lux

+0

@lux Время в этом контексте бессмысленно. Я хочу, чтобы он рассматривал дни как фундаментальную единицу времени в этом случае. Итак, 20 февраля, 20 февраля, независимо от того, где во вселенной вы живете. – Legion

ответ

1

Разбор строк с конструктором даты (или Date.parse) не рекомендуется, так как он в значительной степени зависит от реализации. В последних браузерах даты формата ISO 8601 анализируются как UTC, следовательно, причина, по которой они компенсируются смещением часового пояса хоста. Старые браузеры не будут обрабатывать даты формата ISO 8601 вообще, а некоторые анализируют их как локальные.

Синтаксический дату требует функции 2 строки, проверка требует еще одно:

/* Parse an ISO 8601 format date string as local 
 
** @param {string} s - date informat yyyy-mm-dd 
 
** @returns {Date} 
 
*/ 
 
function parseLocal(s) { 
 
    var b = s.split(/\D/); 
 
    var d = new Date(b[0], --b[1], b[2]); 
 
    return d && d.getMonth() == b[1]? d : new Date(NaN); 
 
} 
 

 
console.log(parseLocal('2017-02-25').toString()); // 25 Feb 2017 
 
console.log(parseLocal('2017-02-30').toString()); // Invalid date

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