Разница между Date(dateString) и new Date(dateString)
Я столкнулся с проблемой при парсинге строки даты в JavaScript. У меня есть код, который пытается обработать строку даты.
Когда я выполняю следующий код:
alert(Date("2010-08-17 12:09:36"));
Он правильно разбирает дату, и всё работает корректно, но я не могу вызвать методы, связанные с объектом Date
, такие как getMonth()
.
Когда я пытаюсь сделать вот так:
var temp = new Date("2010-08-17 12:09:36");
alert(temp);
Я получаю ошибку "недействительная дата".
Есть идеи, как правильно распарсить строку "2010-08-17 12:09:36" с помощью new Date()
?
5 ответ(ов)
Формат, который работает во всех браузерах:
new Date("2010/08/17 12:09:36");
Для того чтобы сделать строку даты в формате yyyy-mm-dd hh:mm:ss
полностью совместимой с браузерами, вам нужно заменить дефисы на слэши:
var dateString = "2010-08-17 12:09:36";
new Date(dateString.replace(/-/g, "/"));
Таким образом, мы преобразуем строку в формат, который поддерживается всеми браузерами.
Разница заключается в том, что, если я правильно помню из документации ECMA, Date("xx")
не создает (в каком-то смысле) новый объект даты (на самом деле это эквивалентно вызову new Date("xx").toString()
). В то время как new Date("xx")
действительно создаст новый объект даты.
Для получения дополнительной информации:
Посмотрите раздел 15.9.2 документации на http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf.
Я понимаю, что вопрос уже старый, но на мой взгляд, самым простым решением будет просто использовать:
var temp = new Date("2010-08-17T12:09:36");
Это позволяет создать объект даты с нужными параметрами без лишних сложностей.
Ваша задача по использованию объекта Date
в JavaScript может быть выполнена с помощью нескольких правильных подходов. На странице MDN, которую вы упомянули, приводятся основные методы и свойства объекта Date
, которые позволяют вам работать с датами и временами.
Вот некоторые корректные методы использования объекта Date
:
Создание даты: Создайте объект
Date
, используя текущую дату и время или указав конкретные значения.let now = new Date(); // текущая дата и время let specificDate = new Date('2023-01-01'); // конкретная дата
Получение значений: Используйте методы для получения различных компонентов даты.
let year = now.getFullYear(); // получаем год let month = now.getMonth(); // получаем месяц (0-11, где 0 - январь) let day = now.getDate(); // получаем день месяца
Форматирование даты: Вы можете форматировать даты, используя методы
toLocaleDateString
илиtoISOString
.let formattedDate = now.toLocaleDateString('ru-RU'); // форматирует дату в локальном формате console.log(formattedDate);
Теперь, что касается вашего кода с Animal
, интересно рассмотреть, как функции в JavaScript могут в зависимости от контекста, в котором они вызываются, вести себя по-разному.
Когда вы вызываете Animal
с помощью new
, вы создаете новый объект, и this
внутри функции ссылается на этот новый объект. Следовательно, x
станет объектом с добавленным свойством abc
.
var x = new Animal(); // создаёт объект с свойством abc
Когда вы вызываете Animal
без new
, функция возвращает значение 1234
, потому что у вас есть оператор return
. В этом случае this
не присваивается новому объекту, и результатом будет просто значение, а не объект.
var y = Animal(); // вернёт 1234
Выводы:
- При использовании конструктора (через
new
) вы создаете новый объект, иthis
ссылается на него. - При обычном вызове функции возвращается то, что указано в
return
, иthis
будет ссылаться на глобальный объект илиundefined
(в строгом режиме).
Эти понимания очень важны для правильной работы с данными и функциями в JavaScript.
Для разбора строки в формате "2010-08-17 12:09:36" с помощью new Date()
рекомендация такова: до ES5 не было четкого формата строки, который бы поддерживался всеми браузерами. Хотя существуют несколько общепринятых форматов, поддержка может варьироваться: некоторые браузеры могут работать с некорректными значениями, другие — нет. Кроме того, некоторые форматы могут поддерживаться в одних браузерах, но не в других.
ES5 добавил поддержку некоторых форматов ISO 8601, однако предложенный формат не соответствует стандарту ISO 8601, и не все используемые браузеры поддерживают его.
Надежный способ — использовать небольшую функцию разбора. Приведенный ниже код разбирает формат, указанный в вопросе, и проверяет корректность значений.
/* Разбор строки даты в формате yyyy-mm-dd hh:mm:ss
** Если строка содержит некорректные значения, будет возвращена недопустимая дата
**
** @param {string} s - строка для разбора, например, "2010-08-17 12:09:36"
** рассматривается как "местная" дата и время
** @returns {Date} - экземпляр Date, созданный на основе разобранной строки
*/
function parseDateString(s) {
var b = s.split(/\D/);
var d = new Date(b[0], --b[1], b[2], b[3], b[4], b[5]);
return d && d.getMonth() == b[1] && d.getHours() == b[3] &&
d.getMinutes() == b[4]? d : new Date(NaN);
}
document.write(
parseDateString('2010-08-17 12:09:36') + '<br>' + // Корректные значения
parseDateString('2010-08-45 12:09:36') // Некорректная дата
);
Эта функция обеспечит надежный разбор заданного формата даты и время, а также проверит, что значения корректные и находятся в допустимых пределах.
Преобразование Unix-метки времени в формат времени в JavaScript
Где найти документацию по форматированию даты в JavaScript?
Как добавить дни к дате?
Как преобразовать дату в UTC?
Как вычислить количество дней между двумя датами?