Является ли объект даты Javascript всегда одним выходным?

В моем приложении Java Script дата хранится в следующем формате:

2011-09-24

Теперь, когда я пытаюсь использовать указанное выше значение для создания нового объекта Date (чтобы я мог получить дату в другом формате), дата всегда возвращается с выходным днем. Увидеть ниже:

var doo = new Date("2011-09-24");
console.log(doo);

журналы:

Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)

Ответ 1

Обратите внимание, что время восточного дневного света -4 hours и часы, на которые вы вернетесь, 20.

20h + 4h = 24h

который составляет полночь 2011-09-24.

Вы получаете правильную дату, вы просто не указали правильный часовой пояс.

Если вам нужно получить доступ к значениям даты, вы можете использовать getUTCDate() или любую из других функций getUTC*():

var d,
    days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);

Ответ 2

Есть несколько сумасшедших вещей, которые происходят с объектом JS DATE, который преобразует строки, например, рассмотрим следующую дату, которую вы предоставили

Примечание. Следующие примеры могут быть или не быть ONE DAY OFF в зависимости от ВАШЕГО часового пояса и текущего времени.

new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

Однако, если мы изменим формат строки на Месяц-День-Год...

new Date("09-24-2011");
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Другой странный

new Date("2011-09-24");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF AS BEFORE.

new Date("2011/09/24"); // change from "-" to "/".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Мы можем легко изменить дефисы в вашей дате "2011-09-24 при создании новой даты

new Date("2011-09-24".replace(/-/g, '\/')); // => "2011/09/24".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Что делать, если у нас была строка даты, например "2011-09-24T00: 00: 00"

new Date("2011-09-24T00:00:00");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

Теперь измените дефис на косую черту, как и раньше; что происходит?

new Date("2011/09/24T00:00:00");
// => Invalid Date

Мне обычно приходится управлять форматом даты 2011-09-24T00: 00: 00, поэтому я это делаю.

new Date("2011-09-24T00:00:00".replace(/-/g, '\/').replace(/T.+/, ''));
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

UPDATE

Если вы предоставляете отдельные аргументы конструктору Date, вы можете получить другие полезные выходы, как описано ниже

Примечание. аргументы могут иметь тип Number или String. Я приведу примеры со смешанными значениями.

Получить первый месяц и день данного года

new Date(2011, 0); // Normal behavior as months in this case are zero based.
=> // Sat Jan 01 2011 00:00:00 GMT-0700 (MST)

Получить последний месяц и день года

new Date((2011 + 1), 0, 0); // The second zero roles back one day into the previous month last day.
=> // Sat Dec 31 2011 00:00:00 GMT-0700 (MST)

Пример числа, строковые аргументы. Обратите внимание, что месяц - март, потому что месяц с нулевым основанием снова.

new Date(2011, "02"); 
=> // Tue Mar 01 2011 00:00:00 GMT-0700 (MST)

Если мы делаем то же самое, но с днем, равным нулю, мы получаем что-то другое.

new Date(2011, "02", 0); // again the zero roles back from March to the last day of February.
=> // Mon Feb 28 2011 00:00:00 GMT-0700 (MST)

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

new Date(2011, "02", -1);
=> // Sun Feb 27 2011 00:00:00 GMT-0700 (MST)

Ответ 3

Чтобы нормализовать дату и устранить нежелательное смещение (здесь протестировано: https://jsfiddle.net/7xp1xL5m/):

var doo = new Date("2011-09-24");
console.log(  new Date( doo.getTime() + Math.abs(doo.getTimezoneOffset()*60000) )  );
// Output: Sat Sep 24 2011 00:00:00 GMT-0400 (Eastern Daylight Time)

Это также делает то же самое и кредит для @tpartee (здесь протестирован: https://jsfiddle.net/7xp1xL5m/1/):

var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() - doo.getTimezoneOffset() * -60000 )  );

Ответ 4

Если вы хотите получить час 0 какой-либо даты в локальном часовом поясе, передайте отдельные части даты конструктору Date.

new Date(2011,08,24); // month value is 0 based, others are 1 based.

Ответ 5

Просто хочу добавить, что, очевидно, добавление пробела в конце строки будет использовать UTC для создания.

new Date("2016-07-06")
> Tue Jul 05 2016 17:00:00 GMT-0700 (Pacific Daylight Time)

new Date("2016-07-06 ")
> Wed Jul 06 2016 00:00:00 GMT-0700 (Pacific Daylight Time)

Изменение: это не рекомендуемое решение, просто альтернативный ответ. Пожалуйста, не используйте этот подход, так как очень неясно, что происходит. Есть несколько способов, которыми кто-то может рефакторировать это случайно, вызывая ошибку.

Ответ 6

Я считаю, что это связано с настройкой часового пояса. Дата, которую вы создали, находится в GMT, а по умолчанию - полночь, но ваш часовой пояс - EDT, поэтому он вычитает 4 часа. Попробуйте это, чтобы подтвердить:

var doo = new Date("2011-09-25 EDT");

Ответ 7

Ваша проблема связана с часовым поясом. Примечание. Часть GMT-0400 - это вы отстаете от GMT на 4 часа. Если вы добавите 4 часа к отображаемой дате/времени, вы получите ровно полночь 2011/09/24. Используйте метод toUTCString() вместо этого, чтобы получить GMT-строку:

var doo = new Date("2011-09-24");
console.log(doo.toUTCString());

Ответ 8

Это через меня для цикла, +1 на zzzBov ответ. Вот полное преобразование даты, которая работала для меня с использованием методов UTC:

//myMeeting.MeetingDate = '2015-01-30T00:00:00'

var myDate = new Date(myMeeting.MeetingDate);
//convert to JavaScript date format
//returns date of 'Thu Jan 29 2015 19:00:00 GMT-0500 (Eastern Standard Time)' <-- One Day Off!

myDate = new Date(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate());
//returns date of 'Fri Jan 30 2015 00:00:00 GMT-0500 (Eastern Standard Time)' <-- Correct Date!

Ответ 9

Это означает 2011-09-24 00:00:00 GMT, и поскольку вы находитесь в GMT -4, это будет 20:00 в предыдущий день.

Лично я получаю 2011-09-24 02:00:00, потому что я живу в GMT +2.

Ответ 10

Это, вероятно, не очень хороший ответ, но я просто хочу поделиться своим опытом с этой проблемой.

Мое приложение использует глобальную дату utc с форматом "YYYY-MM-DD", а плагин datepicker использует только дату js date, мне сложно рассмотреть как utc, так и js. Поэтому, когда я хочу передать дату "YYYY-MM-DD" в мой datepicker, я сначала конвертирую его в формат "MM/DD/YYYY", используя moment.js или что угодно, и дата показывает, что datepicker теперь верный. Для вашего примера

var d = new Date('2011-09-24'); // d will be 'Fri Sep 23 2011 20:00:00 GMT-0400 (EDT)' for my lacale
var d1 = new Date('09/24/2011'); // d1 will be 'Sat Sep 24 2011 00:00:00 GMT-0400 (EDT)' for my lacale

По-видимому, d1 - это то, что я хочу. Надеюсь, это будет полезно для некоторых людей.

Ответ 11

Хотя в случае OP часовой пояс EDT, не гарантируется, что пользователь, выполняющий ваш script, будет включать часовой пояс EDT, поэтому жесткое кодирование смещения не обязательно будет работать. Решение, которое я нашел, разделяет строку даты и использует отдельные значения в конструкторе Date.

var dateString = "2011-09-24";
var dateParts = dateString.split("-");
var date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);

Обратите внимание, что вам нужно учитывать еще одну вещь JS weirdness: месяц основан на нуле.

Ответ 12

Лучший способ справиться с этим, не используя больше методов преобразования,

 var mydate='2016,3,3';
 var utcDate = Date.parse(mydate);
 console.log(" You're getting back are 20.  20h + 4h = 24h :: "+utcDate);

Теперь просто добавьте GMT ​​в свою дату или вы можете добавить его.

 var  mydateNew='2016,3,3'+ 'GMT';
 var utcDateNew = Date.parse(mydateNew);
 console.log("the right time that you want:"+utcDateNew)

Live: https://jsfiddle.net/gajender/2kop9vrk/1/

Ответ 13

Я столкнулся с такой проблемой, как эта. Но моя проблема была смещена при получении даты из базы данных.

это указано в базе данных и в формате UTC.

2019-03-29 19: 00: 00.0000000 +00: 00

Поэтому, когда я получаю информацию из базы данных и проверяю дату, она добавляет смещение и отправляет обратно в javascript.

enter image description here

Он добавляет +05: 00, потому что это часовой пояс моего сервера. Мой клиент находится в другом часовом поясе +07: 00.

2019-03-28T19: 00: 00 +05: 00//это то, что я получаю в JavaScript.

Так вот мое решение, что я делаю с этой проблемой.

var dates = price.deliveryDate.split(/-|T|:/);
var expDate = new Date(dates[0], dates[1] - 1, dates[2], dates[3], dates[4]);
var expirationDate = new Date(expDate);

Поэтому, когда дата приходит с сервера и имеет смещение сервера, я делю дату и удаляю смещение сервера, а затем преобразую в дату. Это решает мою проблему.

Ответ 14

Вы используете формат строки даты ISO, который, согласно этой странице, приводит к построению даты с использованием часового пояса UTC:

Примечание: синтаксический анализ строк даты с помощью конструктора Date (и Date.parse, они эквивалентны) настоятельно не рекомендуется из-за различий и несоответствий в браузере. Поддержка строк формата RFC 2822 предоставляется только по соглашению. Поддержка форматов ISO 8601 отличается тем, что строки, содержащие только дату (например, "1970-01-01"), обрабатываются как UTC, а не как локальные.

Если вы форматируете текст по-другому, например, "Jan 01 1970", то (по крайней мере, на моем компьютере) он использует ваш локальный часовой пояс.

Ответ 15

Я столкнулся именно с этой проблемой, когда мой клиент находился в Атлантическом стандартном времени. Значение даты, полученное клиентом, было "2018-11-23", и когда код передал его в new Date("2018-11-23") выходные данные для клиента были new Date("2018-11-23") за предыдущий день. Я создал служебную функцию, как показано во фрагменте, который нормализовал дату, давая клиенту ожидаемую дату.

date.setMinutes(date.getMinutes() + date.getTimezoneOffset());

var normalizeDate = function(date) {
  date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
  return date;
};

var date = new Date("2018-11-23");

document.getElementById("default").textContent = date;
document.getElementById("normalized").textContent = normalizeDate(date);
<h2>Calling new Date("2018-11-23")</h2>
<div>
  <label><b>Default</b> : </label>
  <span id="default"></span>
</div>
<hr>
<div>
  <label><b>Normalized</b> : </label>
  <span id="normalized"></span>
</div>

Ответ 16

Следующие работали для меня -

    var doo = new Date("2011-09-24").format("m/d/yyyy");

Ответ 17

nevermind, не заметил GMT -0400, который заставляет дату быть вчера

Вы можете попытаться установить время по умолчанию "12:00"