0

Разница между Date(dateString) и new Date(dateString)

12

Я столкнулся с проблемой при парсинге строки даты в 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 ответ(ов)

0

Формат, который работает во всех браузерах:

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, "/"));

Таким образом, мы преобразуем строку в формат, который поддерживается всеми браузерами.

0

Разница заключается в том, что, если я правильно помню из документации 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.

0

Я понимаю, что вопрос уже старый, но на мой взгляд, самым простым решением будет просто использовать:

var temp = new Date("2010-08-17T12:09:36");

Это позволяет создать объект даты с нужными параметрами без лишних сложностей.

0

Ваша задача по использованию объекта Date в JavaScript может быть выполнена с помощью нескольких правильных подходов. На странице MDN, которую вы упомянули, приводятся основные методы и свойства объекта Date, которые позволяют вам работать с датами и временами.

Вот некоторые корректные методы использования объекта Date:

  1. Создание даты: Создайте объект Date, используя текущую дату и время или указав конкретные значения.

    let now = new Date(); // текущая дата и время
    let specificDate = new Date('2023-01-01'); // конкретная дата
    
  2. Получение значений: Используйте методы для получения различных компонентов даты.

    let year = now.getFullYear(); // получаем год
    let month = now.getMonth(); // получаем месяц (0-11, где 0 - январь)
    let day = now.getDate(); // получаем день месяца
    
  3. Форматирование даты: Вы можете форматировать даты, используя методы 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.

0

Для разбора строки в формате "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')             // Некорректная дата
);

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь