ToDateString() уменьшает мою дату

Для следующего кода:

var d = new Date("2013-07-01");
console.log(d.toDateString());

Он выводит Sun Jun 30 2013, что на один день меньше того, что было введено. Что случилось с объектом? Какая дата на самом деле хранится?

Ответ 1

Дата анализируется как дата UTC, но toDateString() выводит то, что это время находится в локальном часовом поясе.

Попробуйте это вместо

var d = new Date(2013, 6, 1); //6 instead of 7 because the mont argument is  zero-based
console.log(d.toDateString());

Какая дата действительно хранится?

2013-07-01 00:00:00 UTC

Ответ 2

Анализ a Date из строки может дать разные результаты в зависимости от того, какой браузер/время выполнения вы используете. Существует диаграмма здесь, в которой перечислены некоторые из браузеров и их поддержка.

Но в целом строка типа "2013-07-01" обрабатывается так, как если бы она была в полночь в UTC.

Если вы хотите разобрать его по местному времени, вы можете использовать "2013/07/01". Но это немного странно. У вас может возникнуть соблазн использовать "07/01/2013", но это может быть интерпретировано как 7 января, так и 1 июля. Любой из них по-прежнему специфичен для реализации.

Если вам нужна общая цель, "работает везде", у вас есть несколько разных вариантов:

Вариант 1

Не разбирайте его. Используйте конструктор, который принимает целые числа.

var d = new Date(2013,6,1);    // watch out for the zero-based month
console.log(d.toDateString());

// output:  "Mon Jul 01 2013"

С помощью этого кода фактическое время UTC будет меняться в зависимости от вашего собственного часового пояса. Но поскольку .toDateString() также учитывает это время, тогда вы должны быть в порядке.

Вариант 2

Разберите его как UTC и покажите его как UTC/GMT:

var d = new Date("2013-07-01");
console.log(d.toUTCString());

// output:  "Mon, 01 Jul 2013 00:00:00 GMT"

Но этот вывод, вероятно, имеет больше, чем вы искали, и он может по-прежнему выглядеть по-разному в разных браузерах.

Вариант 3

Используйте библиотеку moment.js, где вы можете точно контролировать форматирование, как хотите.

var m = moment("2013-07-01", "YYYY-MM-DD");  // explicit input format
console.log(m.format("ddd MMM DD YYYY"));    // explicit output format

// output:  "Mon Jul 01 2013"

IMHO, это лучшее решение. Но для этого требуется использовать библиотеку.

Ответ 3

Вариант 4

Этот подход работает очень хорошо и не требует сторонних библиотек.

    var parts ='2013-07-01'.split('-');
    var mydate = new Date(Date.UTC(parts[0],parts[1]-1,parts[2])); //please put attention to the month