Относительно JavaScript новые Date() и Date.parse()

Это мой код:

  var exampleDate='23-12-2010 23:12:00';  
  var date=new Date(exampleDate);//returns invalid Date
  var date1=Date.parse(exampleDate);//returns NAN

Я хочу преобразовать вышеуказанную строку в дату. Итак, я написал код, как вы видели выше.

Этот код работает нормально в IE а также Opera, но date переменная возвращает мне неверную дату и date1 возвращается NAN в mozilla Firefox, что я должен делать?

7 ответов

Решение

Выше формат поддерживается только в IE и Chrome.

так что попробуйте с другими форматами. Ниже приведены некоторые форматы, поддерживающие браузеры.

<script type="text/javascript">

//var dateString = "03/20/2008";  // mm/dd/yyyy [IE, FF]

 var dateString = "2008/03/20";  // yyyy/mm/dd [IE, FF]
// var dateString = "03-20-2008";  // mm-dd-yyyy [IE, Chrome]
// var dateString = "March 20, 2008";  // mmmm dd, yyyy [IE, FF]
// var dateString = "Mar 20, 2008";  // mmm dd, yyyy [IE, FF]

// Initalize the Date object by passing the date string variable
var myDate = new Date(dateString);
alert(myDate); 
</script>

Строка в вашем примере не соответствует ни одному из стандартных форматов, распознаваемых браузерами. Спецификация ECMAScript требует, чтобы браузеры могли анализировать только один стандартный формат:

Формат выглядит следующим образом: YYYY-MM-DDTHH:mm:ss.sssZ

Этот формат включает формы только для даты:

YYYY

YYYY-MM

YYYY-MM-DD

Он также включает в себя только временные формы с добавлением необязательного смещения часового пояса:

THH:mm

THH:mm:ss

THH:mm:ss.sss

Также включены "дата-время", которые могут быть любой комбинацией вышеперечисленного.

Если строка не соответствует этому формату, функция может прибегнуть к любым зависящим от реализации эвристикам или форматам дат, зависящим от реализации. Нераспознаваемые строки или даты, содержащие недопустимые значения элементов в формате String, должны вызывать Date.parse для возврата NaN.

Так что в вашем примере, используя 2010-12-23T23:12:00 является единственной гарантированной строкой На практике большинство браузеров также допускают даты в формате DD Month YYYY или же Month DD, YYYYтак что строки вроде 23 Dec 2010 а также Dec 23, 2010 также может работать.

Вы можете разобрать его вручную с помощью регулярного выражения, а затем вызвать конструктор даты с элементами даты, например:

var parseDate = function(s) {
  var re = /^(\d\d)-(\d\d)-(\d{4}) (\d\d):(\d\d):(\d\d)$/;
  var m = re.exec(s);
  return m ? new Date(m[3], m[2]-1, m[1], m[4], m[5], m[6]) : null;
};
var dateStr = '23-12-2010 23:12:00';
parseDate(dateStr).toString(); //=> Thu Dec 23 2010 23:12:00 GMT-0800

JavaScript должен поддерживать преобразование по крайней мере из следующих dateStrings:

* yyyy/MM/dd
* MM/dd/yyyy
* MMMM dd, yyyy
* MMM dd, yyyy

Попробуйте с:

  var exampleDate='12/23/2010 23:12:00';
  var date = new Date(exampleDate); 

Используйте datejs и этот код:

var exampleDate='23-12-2010 23:12:00';
var myDate = Date.parseExact(exampleDate, 'dd-MM-yyyy hh:mm:ss');

myDate должен быть правильно построен Date объект.

У @casablanca есть хороший ответ, но прошло уже более 10 лет, и он все еще имеет большой вес в Google, поэтому я подумал, что обновлю новый ответ.

TL;DR

      // Use an ISO or Unix time string to generate `Month DD, YYYY` 
const newDate = new Date('23-12-2010')
const simpleDate = `${newDate.toLocaleString('en-us', { month: 'long' } )} ${newDate.getDate()}, ${newDate.getFullYear()}`
// yields: December, 23 2010 (if you want date suffix, read until the end)

Предыстория: даты бывают разных форматов, но в основном вы получите:

  • Дата в формате ISO 8601 ( YYYY-MM-DDTHH:mm:ss.sssZ) где Zэто смещение часового пояса UTC. Вы также можете получить подмножество этого (т. Е. YYYY-MM-DD)
  • Дата в формате временной метки Unix ( 1539734400), где число - это буквально общее количество миллисекунд с начала времен Unix, 1 января 1970 года.

Основы: JS имеет встроенный прототип даты, который принимает ISO 8601 и производные (только время или только дату). Вы можете создать экземпляр с помощью new Date и верните объект даты ИЛИ вы можете использовать Date.parse() для возврата отметки времени Unix.

      const dateObj = new Date('23-12-2010:23:12:00') // returns date object
const dateDateOnly = new Date('23-12-2010') // returns date object
const dateTimeOnly = new Date('23:12:00') // returns date object
const dateString = Date.parse('23-12-2010:23:12:00') // returns Unix timestamp string

Вы также можете разбить дату на 7 параметров: год, месяц (начиная с 0), день, час, минуты, секунды и миллисекунды со смещением часового пояса - ПРИМЕЧАНИЕ, я использовал подход с несколькими параметрами. только один раз в моей карьере. Поскольку я нахожусь в Техасе, я получаю UTC-5 (центральное время), когда запускаю следующее:

      const dateByParam = new Date(2021, 2, 26, 13, 50, 13, 30) // Fri Mar 26 2021 13:50:13 GMT-0500 (Central Daylight Time)

Новые вещи toLocaleString: Обычно возврат из Date объект все еще довольно плотный, как в нашем последнем примере ( Fri Mar 26 2021 13:50:13 GMT-0500 (Central Daylight Time), поэтому для помощи разработчикам были добавлены дополнительные методы.

Обычно на свидании я хочу что-то вроде March 21st, 2021 - день и год уже давно легко получить:

      // Assuming myDate is a JS Date object...
myDate.getDate() // date on the calendar, ie 22
myDate.getDay() // day of the week, where 0 means Sunday, 1 means monday, etc
myDate.getFullYear() // 4 digit year, ie, 2021

Но мне всегда приходилось создавать функцию, чтобы превратить getDay в January, February, March, уже нет. toLocaleString()дает вам новые сверхспособности. Вы можете передать ему два параметра, строку для региона (т. Е. en-us) и объект, который вы хотите вернуть (т. е. { month: 'long' }). При необходимости это помогает интернационализировать ответ.

      // Again, assuming myDate is a JS Date object...
myDate.toLocaleString('en-us', { month: 'long' } ) // March

Суффикс даты Я до сих пор не видел встроенного способа получить суффикс даты, например th, st, поэтому я создал эту служебную функцию, которая использует модуль % оператор, чтобы проверить делитель числа каждого дня и применить правильный суффикс (ориентированный на американскую аудиторию, но может быть таким же в другом месте?).

      /**
 * setDateSuffix()
 * 
 * Desc: Takes two digit date, adds 'st', 'nd', 'rd', etc
 * 
 * @param { integer } num - a number date
 */

export const setDateSuffix = (num) => {
  const j = num % 10,
        k = num % 100

  if (j === 1 && k !== 11) {
    return num + "st";
  }
  if (j === 2 && k !== 12) {
    return num + "nd";
  }
  if (j === 3 && k !== 13) {
    return num + "rd";
  }

  return num + "th";
}

Теперь все вместе ... Длинный способ добраться сюда, но если мне дадут дату ISO или Unix, и я хочу Month DDth, YYYY, вот что я бегу:

      // setDateSuffix IS NOT PART OF BUILT-IN JS!
const newDate = new Date('23-12-2010')
const simpleDate = `${newDate.toLocaleString('en-us', { month: 'long' } )} ${setDateSuffix(newDate.getDate())}, ${newDate.getFullYear()}`
// yields: December, 23rd 2010 

Обратите внимание: все это, скорее всего, изменится, надеюсь, к лучшему, когда temporalстановится реальностью в JS: https://github.com/tc39/proposal-temporal. С нетерпением ждем чьего-нибудь обновления этого поста в 2030 году!

Просто используйте в этом формате:

var exampleDate='2010-12-23 23:12:00'; 
Другие вопросы по тегам