Для следующего кода:
var d = new Date("2013-07-01");
console.log(d.toDateString());
Он выводит Sun Jun 30 2013, что на один день меньше того, что было введено. Что случилось с объектом? Какая дата на самом деле хранится?
Для следующего кода:
var d = new Date("2013-07-01");
console.log(d.toDateString());
Он выводит Sun Jun 30 2013, что на один день меньше того, что было введено. Что случилось с объектом? Какая дата на самом деле хранится?
Дата анализируется как дата 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
Анализ a Date
из строки может дать разные результаты в зависимости от того, какой браузер/время выполнения вы используете. Существует диаграмма здесь, в которой перечислены некоторые из браузеров и их поддержка.
Но в целом строка типа "2013-07-01"
обрабатывается так, как если бы она была в полночь в UTC.
Если вы хотите разобрать его по местному времени, вы можете использовать "2013/07/01"
. Но это немного странно. У вас может возникнуть соблазн использовать "07/01/2013"
, но это может быть интерпретировано как 7 января, так и 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()
также учитывает это время, тогда вы должны быть в порядке.
Разберите его как UTC и покажите его как UTC/GMT:
var d = new Date("2013-07-01");
console.log(d.toUTCString());
// output: "Mon, 01 Jul 2013 00:00:00 GMT"
Но этот вывод, вероятно, имеет больше, чем вы искали, и он может по-прежнему выглядеть по-разному в разных браузерах.
Используйте библиотеку 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, это лучшее решение. Но для этого требуется использовать библиотеку.
Вариант 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