Где я могу найти документацию по форматированию даты в JavaScript?
Я заметил, что JavaScript new Date()
Функция очень умна в приеме дат в нескольких форматах.
Xmas95 = new Date("25 Dec, 1995 23:15:00")
Xmas95 = new Date("2009 06 12,12:52:39")
Xmas95 = new Date("20 09 2006,12:52:39")
Я не смог найти документацию, где бы отображались все допустимые форматы строк при вызове new Date()
функция.
Это для преобразования строки в дату. Если мы посмотрим на противоположную сторону, то есть на преобразование объекта даты в строку, до сих пор у меня сложилось впечатление, что в JavaScript нет встроенного API для форматирования объекта даты в строку.
Примечание редактора: следующий подход - это попытка автора, которая работала в конкретном браузере, но не работает вообще; см. ответы на этой странице, чтобы увидеть некоторые актуальные решения.
Сегодня я играл с toString()
Метод на объекте даты и, что удивительно, служит для форматирования даты в строки.
var d1 = new Date();
d1.toString('yyyy-MM-dd'); //Returns "2009-06-29" in Internet Explorer, but not Firefox or Chrome
d1.toString('dddd, MMMM ,yyyy') //Returns "Monday, June 29,2009" in Internet Explorer, but not Firefox or Chrome
Также здесь я не смог найти никакой документации о том, как мы можем отформатировать объект даты в строку.
Где находится документация, в которой перечислены спецификаторы формата, поддерживаемые Date()
объект?
39 ответов
Мне нравятся 10 способов форматирования времени и даты с использованием JavaScript и работы с датами.
По сути, у вас есть три метода, и вы должны объединить строки для себя:
getDate() // Returns the date
getMonth() // Returns the month
getFullYear() // Returns the year
Пример:
var d = new Date();
var curr_date = d.getDate();
var curr_month = d.getMonth() + 1; //Months are zero based
var curr_year = d.getFullYear();
console.log(curr_date + "-" + curr_month + "-" + curr_year);
Это (облегченная)* библиотека дат JavaScript для анализа, манипулирования и форматирования дат.
var a = moment([2010, 1, 14, 15, 25, 50, 125]);
a.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, February 14th 2010, 3:25:50 pm"
a.format("ddd, hA"); // "Sun, 3PM"
(*) облегченный, означающий минимизированный 9,3 КБ + сжатый в минимальной возможной конфигурации (февраль 2014 г.)
Если вы уже используете JQuery UI в своем проекте, вы можете использовать встроенный метод datepicker для форматирования вашего объекта даты:
$.datepicker.formatDate('yy-mm-dd', new Date(2007, 1 - 1, 26));
Однако средство выбора даты только форматирует даты и не может форматировать время.
Взгляните на http://docs.jquery.com/UI/Datepicker/formatDate, примеры.
Пользовательская функция форматирования:
Для фиксированных форматов, простая функция сделать работу. В следующем примере создайте международный формат YYYY-MM-DD:
function dateToYMD(date) {
var d = date.getDate();
var m = date.getMonth() + 1;
var y = date.getFullYear();
return '' + y + '-' + (m<=9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d);
}
Примечание: однако, как правило, не стоит расширять стандартные библиотеки Javascript (например, путем добавления этой функции в прототип Date).
Более продвинутая функция может генерировать настраиваемый вывод на основе параметра формата. На этой же странице есть несколько хороших примеров.
Если написать функцию форматирования слишком долго, есть множество библиотек, вокруг которых это делается. Некоторые другие ответы уже перечисляют их. Но увеличение зависимостей также имеет свою противоположность.
Стандартные функции форматирования ECMAScript:
Поскольку более поздние версии ECMAscript, Date
Класс имеет некоторые специфические функции форматирования:
toDateString: зависит от реализации, показывает только дату.
http://www.ecma-international.org/ecma-262/7.0/index.html
new Date().toDateString(); // e.g. "Fri Nov 11 2016"
toISOString: Показать дату и время ISO 8601.
http://www.ecma-international.org/ecma-262/7.0/index.html
new Date().toISOString(); // e.g. "2016-11-21T08:00:00.000Z"
toJSON: Stringifier для JSON.
http://www.ecma-international.org/ecma-262/7.0/index.html
new Date().toJSON(); // e.g. "2016-11-21T08:00:00.000Z"
toLocaleDateString: Зависит от реализации, дата в формате локали.
http://www.ecma-international.org/ecma-262/7.0/index.html
new Date().toLocaleDateString(); // e.g. "21/11/2016"
toLocaleString: Зависит от реализации, дата и время в формате локали.
http://www.ecma-international.org/ecma-262/7.0/index.html
new Date().toLocaleString(); // e.g. "21/11/2016, 08:00:00 AM"
toLocaleTimeString: зависит от реализации, время в формате локали.
http://www.ecma-international.org/ecma-262/7.0/index.html
new Date().toLocaleTimeString(); // e.g. "08:00:00 AM"
toString: универсальный toString для даты.
http://www.ecma-international.org/ecma-262/7.0/index.html
new Date().toString(); // e.g. "Fri Nov 11 2016 08:00:00 GMT+0100 (W. Europe Standard Time)"
Примечание: из этих функций форматирования можно создать собственный вывод:
new Date().toISOString().slice(0,10); // By @Image72, return YYYY-MM-DD
Где находится документация, в которой перечислены спецификаторы формата, поддерживаемые
Date()
объект?
Я наткнулся на это сегодня и был весьма удивлен, что никто не нашел время, чтобы ответить на этот простой вопрос. Правда, есть много библиотек, которые могут помочь с манипулированием датами. Некоторые лучше, чем другие. Но это был не тот вопрос, который был задан.
AFAIK, чистый JavaScript не поддерживает спецификаторы формата так, как вы указали, что вы хотели бы их использовать. Но он поддерживает методы форматирования даты и / или времени, такие как .toLocaleDateString()
, .toLocaleTimeString()
, а также .toUTCString()
,
Date
Ссылка на объект, которую я использую чаще всего, находится на веб-сайте w3schools.com (но быстрый поиск в Google покажет гораздо больше, которые могут лучше удовлетворить ваши потребности).
Также обратите внимание, что в разделе " Свойства объекта Date " содержится ссылка на prototype
, который иллюстрирует некоторые способы расширения объекта Date с помощью пользовательских методов. В течение многих лет в сообществе JavaScript велись споры о том, является ли это наилучшей практикой, и я не выступаю за или против нее, а просто указываю на ее существование.
Краткий ответ
Нет "универсальной" документации, которая бы обслуживала javascript; каждый браузер с javascript действительно является реализацией. Тем не менее, существует стандарт, которому склонны следовать большинство современных браузеров, и это стандарт EMCAScript; Стандартные строки ECMAScript будут, как минимум, принимать модифицированную реализацию определения ISO 8601.
В дополнение к этому, IETF предлагает второй стандарт, которому, как правило, следуют браузеры, - это определение временных меток, сделанное в RFC 2822. Актуальную документацию можно найти в списке ссылок внизу.
От этого вы можете ожидать базовой функциональности, но то, что "должно" быть, не является тем, что "есть". Я собираюсь немного углубиться в это с процедурной точки зрения, хотя, как представляется, только три человека фактически ответили на вопрос (а именно Скотт, goofballLogic и Пеллер), который, как мне кажется, предполагает, что большинство людей не знают о том, что на самом деле происходит, когда вы создать объект Date.
Длинный ответ
Где находится документация, в которой перечислены спецификаторы формата, поддерживаемые объектом Date()?
Чтобы ответить на вопрос или, как правило, даже искать ответ на этот вопрос, вам нужно знать, что javascript не является новым языком; на самом деле это реализация ECMAScript и соответствует стандартам ECMAScript (но обратите внимание, javascript также предшествовал этим стандартам; стандарты EMCAScript построены на ранней реализации LiveScript/JavaScript). Текущий стандарт ECMAScript - 5.1 (2011); в то время, когда этот вопрос был первоначально задан (июнь '09), стандартом было 3 (4 было отменено), но 5 было выпущено вскоре после публикации в конце 2009 года. Это должно обозначить одну проблему; каким стандартам может следовать реализация javascript, может не отражать то, что на самом деле имеет место, потому что a) это реализация данного стандарта, b) не все реализации стандарта являются пуританскими, и c) функциональность не высвобождается синхронно с новый стандарт, как г) внедрение - постоянная работа в процессе
По сути, когда вы имеете дело с javascript, вы имеете дело с производной (специфичной для браузера javascript) реализации (сам javascript). Например, Google V8 реализует ECMAScript 5.0, но JScript Internet Explorer не пытается соответствовать какому-либо стандарту ECMAScript, но Internet Explorer 9 действительно соответствует ECMAScript 5.0.
Когда одиночный аргумент передается в новый Date(), он вызывает этот прототип функции:
new Date(value)
Когда два или более аргумента передаются в новый Date(), он вызывает этот прототип функции:
new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
Обе эти функции должны выглядеть знакомо, но это не сразу отвечает на ваш вопрос, и что количественно определяет как приемлемый "формат даты", требует дальнейшего объяснения. Когда вы передаете строку в новый Date(), он вызывает прототип (обратите внимание, что я свободно использую слово prototype; версии могут быть отдельными функциями или частью условного оператора в одной функции) для новая Дата (значение) с вашей строкой в качестве аргумента для параметра "значение". Эта функция сначала проверит, является ли это число или строка. Документацию по этой функции можно найти здесь:
Из этого мы можем сделать вывод, что для получения разрешенного форматирования строки для новой даты (значения) мы должны взглянуть на метод Date.parse(строка). Документацию по этому методу можно найти здесь:
И мы можем далее сделать вывод, что даты должны быть в измененном расширенном формате ISO 8601, как указано здесь:
Однако из опыта мы можем понять, что объект Date в javascript принимает другие форматы (в первую очередь, обусловленные наличием этого вопроса), и это нормально, потому что ECMAScript допускает использование определенных форматов реализации. Однако это по-прежнему не отвечает на вопрос о том, какая документация доступна в доступных форматах и какие форматы фактически разрешены. Мы рассмотрим реализацию Google JavaScript, V8; обратите внимание, я не утверждаю, что это "лучший" движок JavaScript (как можно определить "лучший" или даже "хороший"), и нельзя предположить, что форматы, допустимые в V8, представляют все форматы, доступные сегодня, но я думаю, что это справедливо предположить, что они соответствуют современным ожиданиям.
Google V8, date.js, DateConstructor
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141
Глядя на функцию DateConstructor, мы можем сделать вывод, что нам нужно найти функцию DateParse; однако, обратите внимание, что "год" не является фактическим годом и является только ссылкой на параметр "год".
Google V8, date.js, DateParse
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270
Это вызывает%DateParseString, который на самом деле является ссылкой на функцию времени выполнения для функции C++. Это относится к следующему коду:
Google V8, runtime.cc,% DateParseString
https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559
Вызов функции, который нас интересует в этой функции, предназначен для DateParser::Parse(); игнорируйте логику, окружающую эти вызовы функций, это просто проверки на соответствие типу кодирования (ASCII и UC16). DateParser::Parse определяется здесь:
Google V8, dateparser-inl.h, DateParser:: Parse
https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36
Это функция, которая на самом деле определяет, какие форматы она принимает. По сути, он проверяет наличие стандарта EMCAScript 5.0 ISO 8601 и, если он не соответствует стандартам, он попытается построить дату на основе устаревших форматов. Несколько ключевых моментов, основанных на комментариях:
- Слова перед первым числом, которые неизвестны парсеру, игнорируются.
- Заключенный в скобки текст игнорируется.
- Числа без знака, за которыми следует ":", интерпретируются как "компонент времени".
- Числа без знака, за которыми следует ".", Интерпретируются как "компонент времени" и должны сопровождаться миллисекундами.
- Числа со знаком, за которыми следует час или часовая минута (например, +5:15 или +0515), интерпретируются как часовой пояс.
- При указании часов и минут вы можете использовать "чч: мм" или "ччмм".
- Слова, обозначающие часовой пояс, интерпретируются как часовой пояс.
- Все остальные числа интерпретируются как "компоненты даты".
- Все слова, которые начинаются с первых трех цифр месяца, интерпретируются как месяц.
- Вы можете определить минуты и часы вместе в любом из двух форматов: "чч: мм" или "ччмм".
- Символы, такие как "+", "-" и "не совпадают"), не допускаются после обработки числа.
- Элементы, которые соответствуют нескольким форматам (например, 1970-01-01), обрабатываются как стандартная строка EMCAScript 5.0 ISO 8601.
Так что этого должно быть достаточно, чтобы дать вам общее представление о том, чего ожидать, когда дело доходит до передачи строки в объект Date. Более подробно об этом вы можете узнать из следующей спецификации, на которую указывает Mozilla в сети разработчиков Mozilla (соответствует меткам времени IETF RFC 2822):
В Microsoft Developer Network дополнительно упоминается дополнительный стандарт для объекта Date: ECMA-402, спецификация API интернационализации ECMAScript, которая дополняет стандарт ECMAScript 5.1 (и будущие). Это можно найти здесь:
В любом случае это должно помочь подчеркнуть, что не существует "документации", которая повсеместно представляет все реализации javascript, но все еще имеется достаточно документации, чтобы разумно понять, какие строки являются приемлемыми для объекта Date. Довольно загруженный вопрос, когда вы думаете об этом, да?:П
Рекомендации
http://www.ecma-international.org/ecma-262/5.1/
http://www.ecma-international.org/ecma-262/5.1/
http://www.ecma-international.org/ecma-262/5.1/
http://tools.ietf.org/html/rfc2822
http://www.ecma-international.org/ecma-402/1.0/
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270
https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559
https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36
Ресурсы
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
http://msdn.microsoft.com/en-us/library/ff743760(v=vs.94).aspx
Обязательно проверяйте Datejs при работе с датами в JavaScript. Это довольно впечатляюще и хорошо документировано, как вы можете видеть в случае функции toString.
РЕДАКТИРОВАТЬ: Тайлер Форсайт указывает, что datejs устарела. Я использую его в своем текущем проекте, и у меня не было никаких проблем, однако вы должны знать об этом и рассмотреть альтернативы.
Вы можете просто расширить Date
Объект с новым format
Метод, как отмечает meizz, ниже приведен код, данный автором. А вот и jsfiddle.
Date.prototype.format = function(format) //author: meizz
{
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3), //quarter
"S" : this.getMilliseconds() //millisecond
}
if(/(y+)/.test(format)) format=format.replace(RegExp.$1,
(this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)if(new RegExp("("+ k +")").test(format))
format = format.replace(RegExp.$1,
RegExp.$1.length==1 ? o[k] :
("00"+ o[k]).substr((""+ o[k]).length));
return format;
}
alert(new Date().format("yyyy-MM-dd"));
alert(new Date("january 12 2008 11:12:30").format("yyyy-MM-dd h:mm:ss"));
Функциональность, которую вы цитируете, не является стандартным Javascript, вряд ли будет переносимой через браузеры и поэтому не является хорошей практикой. Спецификация ECMAScript 3 оставляет функцию синтаксического анализа и выходных форматов вплоть до реализации Javascript. ECMAScript 5 добавляет подмножество поддержки ISO8601. Я считаю, что функция toString(), которую вы упоминаете, является новшеством в одном браузере (Mozilla?)
Несколько библиотек предоставляют подпрограммы для параметризации, некоторые с расширенной поддержкой локализации. Вы также можете проверить методы в dojo.date.locale.
Я сделал этот очень простой форматтер, он вырезан /n/pastable (обновлен с более новой версией):
function DateFmt(fstr) {
this.formatString = fstr
var mthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
var dayNames = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
var zeroPad = function(number) {
return ("0"+number).substr(-2,2);
}
var dateMarkers = {
d:['getDate',function(v) { return zeroPad(v)}],
m:['getMonth',function(v) { return zeroPad(v+1)}],
n:['getMonth',function(v) { return mthNames[v]; }],
w:['getDay',function(v) { return dayNames[v]; }],
y:['getFullYear'],
H:['getHours',function(v) { return zeroPad(v)}],
M:['getMinutes',function(v) { return zeroPad(v)}],
S:['getSeconds',function(v) { return zeroPad(v)}],
i:['toISOString']
};
this.format = function(date) {
var dateTxt = this.formatString.replace(/%(.)/g, function(m, p) {
var rv = date[(dateMarkers[p])[0]]()
if ( dateMarkers[p][1] != null ) rv = dateMarkers[p][1](rv)
return rv
});
return dateTxt
}
}
fmt = new DateFmt("%w %d:%n:%y - %H:%M:%S %i")
v = fmt.format(new Date())
Каркас бесплатный, ограниченный, но легкий
var d = (new Date()+'').split(' ');
// ["Tue", "Sep", "03", "2013", "21:54:52", "GMT-0500", "(Central", "Daylight", "Time)"]
[d[3], d[1], d[2], d[4]].join(' ');
// "2013 Sep 03 21:58:03"
DateJS, конечно, полнофункциональный, но я бы порекомендовал эту намного более простую библиотеку (JavaScript Date Format), которую я предпочитаю просто, потому что это всего 120 строк или около того.
Посмотрев несколько вариантов, представленных в других ответах, я решил написать свое собственное ограниченное, но простое решение, которое другие также могут найти полезным.
/**
* Format date as a string
* @param date - a date object (usually "new Date();")
* @param format - a string format, eg. "DD-MM-YYYY"
*/
function dateFormat(date, format) {
// Calculate date parts and replace instances in format string accordingly
format = format.replace("DD", (date.getDate() < 10 ? '0' : '') + date.getDate()); // Pad with '0' if needed
format = format.replace("MM", (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1)); // Months are zero-based
format = format.replace("YYYY", date.getFullYear());
return format;
}
Пример использования:
console.log("The date is: " + dateFormat(new Date(), "DD/MM/YYYY"));
Вот функция, которую я часто использую. Результат: гггг-мм-дд чч: мм: сс.ннн.
function date_and_time() {
var date = new Date();
//zero-pad a single zero if needed
var zp = function (val){
return (val <= 9 ? '0' + val : '' + val);
}
//zero-pad up to two zeroes if needed
var zp2 = function(val){
return val <= 99? (val <=9? '00' + val : '0' + val) : ('' + val ) ;
}
var d = date.getDate();
var m = date.getMonth() + 1;
var y = date.getFullYear();
var h = date.getHours();
var min = date.getMinutes();
var s = date.getSeconds();
var ms = date.getMilliseconds();
return '' + y + '-' + zp(m) + '-' + zp(d) + ' ' + zp(h) + ':' + zp(min) + ':' + zp(s) + '.' + zp2(ms);
}
Все браузеры
Самый надежный способ форматирования даты с использованием исходного формата, который вы используете, - это выполнить следующие шаги:
- использование
new Date()
создатьDate
объект - использование
.getDate()
,.getMonth()
а также.getFullYear()
чтобы получить соответственно день, месяц и год - Вставьте части вместе в соответствии с вашим целевым форматом
Пример:
var date = '2015-11-09T10:46:15.097Z';
function format(input) {
var date = new Date(input);
return [
("0" + date.getDate()).slice(-2),
("0" + (date.getMonth()+1)).slice(-2),
date.getFullYear()
].join('/');
}
document.body.innerHTML = format(date); // OUTPUT : 09/11/2015
(Смотрите также эту скрипку).
Только современные браузеры
Вы также можете использовать встроенный .toLocaleDateString
способ сделать форматирование для вас. Вам просто нужно указать правильную локаль и параметры для соответствия нужному формату, который, к сожалению, поддерживается только современными браузерами (*):
var date = '2015-11-09T10:46:15.097Z';
function format(input) {
return new Date(input).toLocaleDateString('en-GB', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
});
}
document.body.innerHTML = format(date); // OUTPUT : 09/11/2015
(Смотрите также эту скрипку).
(*) Согласно MDN, "современные браузеры" означают ночные сборки Chrome 24+, Firefox 29+, IE11, Edge12+, Opera 15+ и Safari.
Вам может пригодиться эта модификация объекта даты, которая меньше любой библиотеки и легко расширяется для поддержки различных форматов:
НОТА:
- Он использует Object.keys(), который не определен в старых браузерах, поэтому вам может понадобиться реализовать полифил по данной ссылке.
КОД
Date.prototype.format = function(format) {
// set default format if function argument not provided
format = format || 'YYYY-MM-DD hh:mm';
var zeropad = function(number, length) {
number = number.toString();
length = length || 2;
while(number.length < length)
number = '0' + number;
return number;
},
// here you can define your formats
formats = {
YYYY: this.getFullYear(),
MM: zeropad(this.getMonth() + 1),
DD: zeropad(this.getDate()),
hh: zeropad(this.getHours()),
mm: zeropad(this.getMinutes())
},
pattern = '(' + Object.keys(formats).join(')|(') + ')';
return format.replace(new RegExp(pattern, 'g'), function(match) {
return formats[match];
});
};
ИСПОЛЬЗОВАНИЕ
var now = new Date;
console.log(now.format());
// outputs: 2015-02-09 11:47
var yesterday = new Date('2015-02-08');
console.log(yesterday.format('hh:mm YYYY/MM/DD'));
// outputs: 00:00 2015/02/08
Просто чтобы продолжить твердый ответ gongzhitaao - это обрабатывает AM/PM
Date.prototype.format = function (format) //author: meizz
{
var hours = this.getHours();
var ttime = "AM";
if(format.indexOf("t") > -1 && hours > 12)
{
hours = hours - 12;
ttime = "PM";
}
var o = {
"M+": this.getMonth() + 1, //month
"d+": this.getDate(), //day
"h+": hours, //hour
"m+": this.getMinutes(), //minute
"s+": this.getSeconds(), //second
"q+": Math.floor((this.getMonth() + 3) / 3), //quarter
"S": this.getMilliseconds(), //millisecond,
"t+": ttime
}
if (/(y+)/.test(format)) format = format.replace(RegExp.$1,
(this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o) if (new RegExp("(" + k + ")").test(format))
format = format.replace(RegExp.$1,
RegExp.$1.length == 1 ? o[k] :
("00" + o[k]).substr(("" + o[k]).length));
return format;
}
Мне не удалось найти какой-либо определенной документации по допустимым форматам даты, поэтому я написал свой собственный тест, чтобы увидеть, что поддерживается в различных браузерах.
http://blarg.co.uk/blog/javascript-date-formats
Мои результаты пришли к выводу, что следующие форматы действительны во всех протестированных мной браузерах (в примерах используется дата "9 августа 2013"):
[Полный год]/[Месяц]/[Номер даты] - Месяц может быть числом с или без начального нуля или именем месяца в коротком или длинном формате, а номер даты может быть с или без начального нуля.
- 2013/08/09
- 2013/08/9
- 2013/8/09
- 2013/8/9
- 2013 / Август / 09
- 2013 / август / 9
- 2013 / Август / 09
- 2013 / август / 9
[Месяц]/[Полный год]/[Номер даты] - Месяцем может быть либо число с или без начального нуля, либо имя месяца в коротком или длинном формате, а номер даты может быть с или без начального нуля.
- 08/2013/09
- 08/2013/9
- 8/2013/09
- 8/2013/9
- Август / 2013/09
- Август / 2013/9
- Август / 2013/09
- Август / 2013/9
Любая комбинация [Полный год], [Имя месяца] и [Номер даты], разделенных пробелами - Название месяца может быть в коротком или длинном формате, а номер даты может быть с или без начального нуля.
- 2013 август 09
- Август 2013 09
- 09 августа 2013
- 09 августа 2013
- 9 августа 2013
- 2013 9 августа
- так далее...
Также действует в "современных браузерах" (или, другими словами, во всех браузерах, кроме IE9 и ниже)
[Полный год]-[Номер месяца]-[Номер даты] - Номер месяца и даты должен включать начальные нули (это формат, используемый типом даты MySQL)
- 2013-08-09
Используя названия месяцев:
Интересно, что при использовании названий месяцев я обнаружил, что когда-либо используются только первые 3 символа названия месяца, так что все перечисленное ниже совершенно верно:
new Date('9 August 2013');
new Date('9 Aug 2013');
new Date('9 Augu 2013');
new Date('9 Augustagfsdgsd 2013');
Библиотека sugar.js обладает отличным функционалом для работы с датами в JavaScript. И это очень хорошо задокументировано.
Sugar очень любит класс Date, начиная с метода Date.create, который может понимать даты практически в любом формате на 15 основных языках, включая относительные форматы, такие как "1 час назад". Даты также могут быть выведены в любом формате или на любом языке с использованием понятного синтаксиса с ярлыками для часто используемых форматов даты. Сложное сравнение дат также возможно с такими методами, как is, которые понимают любой формат и применяют встроенную точность.
Несколько примеров:
Date.create('July 4, 1776') -> July 4, 1776
Date.create(-446806800000) -> November 5, 1955
Date.create(1776, 6, 4) -> July 4, 1776
Date.create('1776年07月04日', 'ja') -> July 4, 1776
Date.utc.create('July 4, 1776', 'en') -> July 4, 1776
Date.create().format('{Weekday} {d} {Month}, {yyyy}') -> Monday July 4, 2003
Date.create().format('{hh}:{mm}') -> 15:57
Date.create().format('{12hr}:{mm}{tt}') -> 3:57pm
Date.create().format(Date.ISO8601_DATETIME) -> 2011-07-05 12:24:55.528Z
Date.create().is('the 7th of June') -> false
Date.create().addMonths(2); ->"Sunday, June 15, 2014 13:39"
Форматирование и особенно разбор дат в JavaScript может быть немного головной болью. Не все браузеры обрабатывают даты одинаково. Поэтому, хотя полезно знать базовые методы, более практично использовать вспомогательную библиотеку.
Библиотека JavaScript XDate Адама Шоу существует с середины 2011 года и все еще находится в стадии активной разработки. Он имеет фантастическую документацию, отличный API, форматирование, пытается оставаться обратно совместимым и даже поддерживает локализованные строки.
Ссылка на изменение строк локали: https://gist.github.com/1221376
Пример кода:
var d = new Date();
var time = d.toISOString().replace(/.*?T(\d+:\d+:\d+).*/, "$1");
Выход:
"13:45:20"
Просто еще один вариант, о котором я писал:
Не уверен, что это поможет, но я нашел это полезным в нескольких проектах - похоже, он будет делать то, что вам нужно.
Поддерживает форматирование даты / времени, математику даты (сложение / вычитание частей даты), сравнение даты, разбор даты и т. Д. Он свободно открыт.
Нет смысла это учитывать, если вы уже используете фреймворк (они все способны), но если вам просто нужно быстро добавить манипуляции с датами в проект, дайте ему шанс.
Использовать эту функцию
toTimeString() and toLocaleDateString()
см. ссылку ниже для получения дополнительной информации https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Правильный способ форматирования даты для возврата "2012-12-29" - использовать скрипт из JavaScript Date Format:
var d1 = new Date();
return d1.format("dd-m-yy");
Этот код НЕ работает:
var d1 = new Date();
d1.toString('yyyy-MM-dd');
Если вы хотите показать только время с двумя цифрами, это может помочь вам:
var now = new Date();
var cHour = now.getHours();
var cMinuts = now.getMinutes();
var cSeconds = now.getSeconds();
var outStr = (cHour <= 0 ? ('0' + cHour) : cHour) + ':' + (cMinuts <= 9 ? ('0' + cMinuts) : cMinuts) + ':' + (cSeconds <= 9 ? '0' + cSeconds : cSeconds);
Почти все современные браузеры теперь поддерживают toLocaleString(locales, options)
& toLocaleDateString(locales, options)
куда
options
- необязательный параметр для указания формата.
Пример:
const event = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));
const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
console.log(event.toLocaleDateString(undefined, options));
// expected output: Thursday, December 20, 2012 (varies according to default locale)
Согласно tc39.es/ecma402 и w3c.org , следующий список поддерживаемых значений параметров:
локали:
ar-SA
,
bn-BD
,
bn-IN
,
cs-CZ
,
da-DK
,
de-AT
,
de-CH
,
de-DE
,
el-GR
,
en-AU
,
en-CA
,
en-GB
,
en-IE
,
en-IN
,
en-NZ
,
en-US
,
en-ZA
,
es-AR
,
es-CL
,
es-CO
,
es-ES
,
es-MX
,
es-US
,
fi-FI
,
fr-BE
,
fr-CA
,
fr-CH
,
fr-FR
,
he-IL
,
hi-IN
,
hu-HU
,
id-ID
,
it-CH
,
it-IT
,
ja-JP
,
ko-KR
,
nl-BE
,
nl-NL
,
no-NO
,
pl-PL
,
pt-BR
,
pt-PT
,
ro-RO
,
ru-RU
,
sk-SK
,
sv-SE
,
ta-IN
,
ta-LK
,
th-TH
,
tr-TR
,
zh-CN
,
zh-HK
,
zh-TW
параметры:
Если вам не нужны все функции, которые предоставляет библиотека, такая как Moment.js, тогда вы можете использовать мой порт strftime. Он легкий (1,35 КБ против 57,9 КБ, уменьшенный по сравнению с Moment.js 2.15.0) и обеспечивает большую часть функциональности strftime()
,
/* Port of strftime(). Compatibility notes:
*
* %c - formatted string is slightly different
* %D - not implemented (use "%m/%d/%y" or "%d/%m/%y")
* %e - space is not added
* %E - not implemented
* %h - not implemented (use "%b")
* %k - space is not added
* %n - not implemented (use "\n")
* %O - not implemented
* %r - not implemented (use "%I:%M:%S %p")
* %R - not implemented (use "%H:%M")
* %t - not implemented (use "\t")
* %T - not implemented (use "%H:%M:%S")
* %U - not implemented
* %W - not implemented
* %+ - not implemented
* %% - not implemented (use "%")
*
* strftime() reference:
* http://man7.org/linux/man-pages/man3/strftime.3.html
*
* Day of year (%j) code based on Joe Orost's answer:
* http://stackru.com/questions/8619879/javascript-calculate-the-day-of-the-year-1-366
*
* Week number (%V) code based on Taco van den Broek's prototype:
* http://techblog.procurios.nl/k/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html
*/
function strftime(sFormat, date) {
if (!(date instanceof Date)) date = new Date();
var nDay = date.getDay(),
nDate = date.getDate(),
nMonth = date.getMonth(),
nYear = date.getFullYear(),
nHour = date.getHours(),
aDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
aMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
aDayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
isLeapYear = function() {
if (nYear&3!==0) return false;
return nYear%100!==0 || year%400===0;
},
getThursday = function() {
var target = new Date(date);
target.setDate(nDate - ((nDay+6)%7) + 3);
return target;
},
zeroPad = function(nNum, nPad) {
return ('' + (Math.pow(10, nPad) + nNum)).slice(1);
};
return sFormat.replace(/%[a-z]/gi, function(sMatch) {
return {
'%a': aDays[nDay].slice(0,3),
'%A': aDays[nDay],
'%b': aMonths[nMonth].slice(0,3),
'%B': aMonths[nMonth],
'%c': date.toUTCString(),
'%C': Math.floor(nYear/100),
'%d': zeroPad(nDate, 2),
'%e': nDate,
'%F': date.toISOString().slice(0,10),
'%G': getThursday().getFullYear(),
'%g': ('' + getThursday().getFullYear()).slice(2),
'%H': zeroPad(nHour, 2),
'%I': zeroPad((nHour+11)%12 + 1, 2),
'%j': zeroPad(aDayCount[nMonth] + nDate + ((nMonth>1 && isLeapYear()) ? 1 : 0), 3),
'%k': '' + nHour,
'%l': (nHour+11)%12 + 1,
'%m': zeroPad(nMonth + 1, 2),
'%M': zeroPad(date.getMinutes(), 2),
'%p': (nHour<12) ? 'AM' : 'PM',
'%P': (nHour<12) ? 'am' : 'pm',
'%s': Math.round(date.getTime()/1000),
'%S': zeroPad(date.getSeconds(), 2),
'%u': nDay || 7,
'%V': (function() {
var target = getThursday(),
n1stThu = target.valueOf();
target.setMonth(0, 1);
var nJan1 = target.getDay();
if (nJan1!==4) target.setMonth(0, 1 + ((4-nJan1)+7)%7);
return zeroPad(1 + Math.ceil((n1stThu-target)/604800000), 2);
})(),
'%w': '' + nDay,
'%x': date.toLocaleDateString(),
'%X': date.toLocaleTimeString(),
'%y': ('' + nYear).slice(2),
'%Y': nYear,
'%z': date.toTimeString().replace(/.+GMT([+-]\d+).+/, '$1'),
'%Z': date.toTimeString().replace(/.+\((.+?)\)$/, '$1')
}[sMatch] || sMatch;
});
}
Пример использования:
strftime('%F'); // Returns "2016-09-15"
strftime('%A, %B %e, %Y'); // Returns "Thursday, September 15, 2016"
// You can optionally pass it a Date object...
strftime('%x %X', new Date('1/1/2016')); // Returns "1/1/2016 12:00:00 AM"
Последний код доступен здесь: https://github.com/thdoan/strftime
Ответ "никуда", так как форматирование даты является проприетарной функциональностью. Я не думаю, что функции toString предназначены для соответствия определенному формату. например, в спецификации ECMAScript 5.1 ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf, 2/8/2013, стр. 173) функция toString документирована следующим образом:
"Содержимое строки зависит от реализации"
Такие функции, как примеры ниже, могут быть использованы для выполнения форматирования довольно легко.
function pad(toPad, padWith) {
return (String(padWith) + String(toPad)).slice(-1 * padWith.length);
}
function dateAsInputValue(toFormat) {
if(!(toFormat instanceof Date)) return null;
return toFormat.getFullYear() + "-" + pad(toFormat.getMonth() + 1, "00") + "-" + pad(toFormat.getDate(), "00");
}
function timeAsInputValue(toFormat) {
if(!(toFormat instanceof Date)) return null;
return pad(toFormat.getHours(), "00") + ":" + pad(toFormat.getMinutes(), "00") + ":" + pad(toFormat.getSeconds(), "00");
}
ленивое решение - использовать
Date.toLocaleString
с правильным кодом региона
чтобы получить список подходящих регионов, вы можете запустить
#!/bin/bash
[ -f bcp47.json ] || \
wget https://raw.githubusercontent.com/pculture/bcp47-json/master/bcp47.json
grep 'tag" : ' bcp47.json | cut -d'"' -f4 >codes.txt
js=$(cat <<'EOF'
const fs = require('fs');
const d = new Date(2020, 11, 12, 20, 00, 00);
fs.readFileSync('codes.txt', 'utf8')
.split('\n')
.forEach(code => {
try {
console.log(code+' '+d.toLocaleString(code))
}
catch (e) { console.log(code+' '+e.message) }
});
EOF
)
# print THE LIST of civilized countries
echo "$js" | node - | grep '2020-12-12 20:00:00'
и вот .... СПИСОК
af ce eo gv ha ku kw ky lt mg rw se sn sv xh zu
ksh mgo sah wae AF KW KY LT MG RW SE SN SV
образец использования:
(new Date()).toLocaleString('af')
// -> '2020-12-21 11:50:15'
:)
(примечание. это МОЖЕТ быть непереносимым.)
date-fns - последний и величайший соперник (на данный момент лучше, чем momentjs). Некоторые из преимуществ:
- Модульный
- Неизменный
- I18n
- Встряхивание деревьев
- Поддержка машинописного текста
Обратитесь сюда за документацией
И вы бы сделали что-то вроде этого:
import { format, formatDistance, formatRelative, subDays } from 'date-fns'
format(new Date(), "'Today is a' eeee")
//=> "Today is a Tuesday"
formatDistance(subDays(new Date(), 3), new Date(), { addSuffix: true })
//=> "3 days ago"
formatRelative(subDays(new Date(), 3), new Date())
//=> "last Friday at 7:26 p.m."