Относительно 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';