Я заметил, что функция 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()
?
Мне нравится 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.3KB, minified + gzipped в наименьшей возможной настройке (feb 2014)
Если вы уже используете jQuery UI в своем проекте, вы можете использовать встроенный метод datepicker для форматирования вашего объекта даты:
$.datepicker.formatDate('yy-mm-dd', new Date(2007, 1 - 1, 26));
Однако datepicker только форматирует даты и не может форматировать время.
Посмотрите jQuery UI datepicker formatDate, примеры.
Где находится документация, в которой перечислены спецификаторы формата, поддерживаемые объектом
Date()
?
Я наткнулся на это сегодня и был очень удивлен, что никто не нашел времени, чтобы ответить на этот простой вопрос. Правда, есть много библиотек для помощи в обработке даты. Некоторые из них лучше других. Но об этом не спрашивали.
AFAIK, чистый JavaScript не поддерживает спецификаторы формата , как вы указали, что хотите использовать их. Но он поддерживает методы форматирования дат и/или времени, например .toLocaleDateString()
, .toLocaleTimeString()
и .toUTCString()
.
Ссылка на объект Date
, которую я использую наиболее часто, находится на веб-сайте w3schools.com (но быстрый поиск Google покажет еще много, которые могут лучше соответствовать вашим потребностям).
Также обратите внимание, что в разделе Свойства объекта даты приведена ссылка на prototype
, которая иллюстрирует некоторые способы продления объекта Date с пользовательскими методами. В течение нескольких лет в сообществе JavaScript было несколько дискуссий о том, является ли это лучшей практикой, и я не выступаю за нее или против нее, просто указывая на ее существование.
Для фиксированных форматов простую функцию выполняет задание. В следующем примере создается международный формат ГГГГ-ММ-ДД:
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 (например, добавив эту функцию в прототип даты).
Более продвинутая функция может генерировать настраиваемый вывод на основе параметра формата. На этой же странице есть несколько хороших примеров.
Если написать функцию форматирования слишком долго, существует множество библиотек, вокруг которых это делается. Некоторые другие ответы уже перечисляют их. Но растущие зависимости также имеют противоположную часть.
Начиная с более поздних версий ECMAscript, класс Date
имеет определенные функции форматирования:
toDateString: зависит от реализации, показывается только дата.
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.todatestring
new Date().toDateString(); // e.g. "Fri Nov 11 2016"
toISOString. Показывать дату и время ISO 8601.
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.toisostring
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#sec-date.prototype.tojson
new Date().toJSON(); // e.g. "2016-11-21T08:00:00.000Z"
toLocaleDateString: зависит от реализации, дата в формате локали.
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaledatestring
new Date().toLocaleDateString(); // e.g. "21/11/2016"
toLocaleString: зависит от реализации, дата и время в формате локали.
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocalestring
new Date().toLocaleString(); // e.g. "21/11/2016, 08:00:00 AM"
toLocaleTimeString: зависит от реализации, время в формате локали.
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaletimestring
new Date().toLocaleTimeString(); // e.g. "08:00:00 AM"
toString: общий параметр toString для даты.
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tostring
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
Нет "универсальной" документации, к которой подходит JavaScript; каждый браузер, у которого есть javascript, действительно является реализацией. Тем не менее, существует стандарт, который, как правило, придерживаются большинство современных браузеров, и это стандарт EMCAScript; стандартные строки ECMAScript, в минимальной степени, должны были модифицировать реализацию определения ISO 8601.
В дополнение к этому, существует второй стандарт, установленный IETF, который, как правило, также просматривают браузеры, что является определением для временные метки, сделанные в RFC 2822. Фактическая документация может быть найдена в списке ссылок внизу.
Из этого вы можете ожидать базовые функциональные возможности, но то, что "должно" быть не по своей сути, "есть". Я собираюсь пойти немного глубже с этим процедурным, хотя, как кажется, только три человека действительно ответили на вопрос (Скотт, goofballLogic и peller именно), которые, как мне кажется, указывают на то, что большинство людей не знают, что на самом деле происходит, когда вы создаете Объект даты.
Где находится документация, в которой перечислены спецификаторы формата, поддерживаемые объектом Date()?
Чтобы ответить на вопрос или, как правило, даже искать ответ на этот вопрос, вам нужно знать, что javascript не является новым языком; на самом деле это реализация ECMAScript и соответствует стандартам ECMAScript (но обратите внимание, что javascript также на самом деле был заранее подготовлен к этим стандартам, стандарты EMCAScript построены на ранней реализации LiveScript/JavaScript). Текущий стандарт ECMAScript - 5,1 (2011 год); в то время, когда вопрос был первоначально задан (09 июня), стандарт был 3 (4 были оставлены), но 5 был выпущен вскоре после публикации в конце 2009 года. Это должно указать одну проблему; какой стандарт реализации javascript может следовать, может не отражать то, что на самом деле существует, потому что: а) его реализация данного стандарта; б) не все реализации стандарта пуританские, а в) функциональность не выдается синхронно с новый стандарт как d) реализация - постоянная работа в процессе
По существу, имея дело с javascript, вы имеете дело с производным (javascript, специфичным для браузера) реализации (сам javascript). Googles V8, например, реализует ECMAScript 5.0, но Internet Explorers JScript не пытается соответствовать стандарту ECMAScript, но Internet Explorer 9 соответствует ECMAScript 5.0.
Когда один аргумент передается новой Date(), он запускает этот прототип функции:
new Date(value)
Когда два или более аргумента передаются новой Date(), он запускает этот прототип функции:
new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
Обе эти функции должны выглядеть знакомыми, но это не сразу отвечает на ваш вопрос и то, что количественно, как приемлемый "формат даты", требует дальнейшего объяснения. Когда вы передаете строку новой Date(), она вызывается прототипом (обратите внимание, что я использую прототип слова свободно, версии могут быть отдельными функциями или могут быть частью условного оператора в одной функции) для новая дата (значение) с вашей строкой в качестве аргумента для параметра "значение". Эта функция сначала проверит, является ли это числом или строкой. Документацию по этой функции можно найти здесь:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2
Из этого можно сделать вывод, что для получения форматирования строк, разрешенного для новой Date (value), мы должны рассмотреть метод Date.parse(string). Документацию по этому методу можно найти здесь:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2
И мы также можем заключить, что сроки ожидаются в модифицированном расширенном формате ISO 8601, как указано здесь:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Тем не менее, по опыту мы можем признать, что объект javascripts Date принимает другие форматы (в первую очередь связанные с существованием этого вопроса), и это нормально, потому что ECMAScript допускает конкретные форматы реализации. Тем не менее, это все равно не отвечает на вопрос о том, какая документация доступна в доступных форматах, и какие форматы фактически разрешены. Собирались взглянуть на реализацию javascript Googles, V8; обратите внимание, что Im не предполагает, что это "лучший" механизм javascript (как определить "лучший" или даже "хороший" ), и нельзя предположить, что форматы, разрешенные в V8, представляют все доступные сегодня форматы, но я думаю, что это справедливо предположить они следуют современным ожиданиям.
Googles V8, date.js, DateConstructor
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141
Посмотрев на функцию DateConstructor, мы можем найти, что нам нужно найти функцию DateParse; однако обратите внимание, что "год" не является фактическим годом и является только ссылкой на параметр "год".
Googles V8, date.js, DateParse
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270
Это вызывает% DateParseString, которая на самом деле является ссылкой на функцию времени выполнения для функции С++. Он ссылается на следующий код:
Googles 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 и, если он не соответствует стандартам, тогда он попытается создать дату на основе устаревших форматов. Несколько ключевых моментов, основанных на комментариях:
Итак, этого должно быть достаточно, чтобы дать вам общее представление о том, что ожидать, когда дело доходит до передачи строки в объект Date. Вы можете дополнительно расширить это, посмотрев следующую спецификацию, которую Mozilla указывает на сеть разработчиков Mozilla (соответствует меткам времени IETF RFC 2822):
В Microsoft Developer Network дополнительно упоминается дополнительный стандарт для объекта Date: ECMA-402, спецификация API интернационализации ECMAScript, которая дополняет стандарт ECMAScript 5.1 (и будущие). Это можно найти здесь:
В любом случае это должно помочь подчеркнуть, что нет "документации", которая повсеместно представляет все реализации javascript, но доступной документации достаточно, чтобы разумно понять, какие строки приемлемы для объекта Date. Довольно загруженный вопрос, когда вы думаете об этом, да?: P
Ссылки
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
http://tools.ietf.org/html/rfc2822#page-14
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.
EDIT: Тайлер Форсайт указывает, что 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())
new DateFmt()
)
Рамка свободная, ограниченная, но легкая
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, безусловно, полнофункциональный, но я бы рекомендовал этот БОЛЬШЕ более простой lib (формат даты JavaScript), который я предпочитаю просто потому, что он составляет всего 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"));
Здесь функция, которую я использую много. Результат: yyyy-mm-dd hh: mm: ss.nnn.
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);
}
Вы можете найти полезную эту модификацию объекта даты, которая меньше любой библиотеки и легко расширяется для поддержки различных форматов:
Примечание:
CODE
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];
});
};
USE
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 года" ):
[Полный год]/[Месяц]/[Номер даты]. Месяцем может быть либо номер с или без начального нуля, либо имя месяца в коротком или длинном формате, а номер даты может быть с нулевым или без него.
[Месяц]/[Годовой год]/[Номер даты]. Месяцем может быть либо номер с или без начального нуля, либо имя месяца в коротком или длинном формате, а номер даты может быть с нулевым или без него.
Любая комбинация из [Полного года], [Месяц] и [Номер даты], разделенных пробелами - Название месяца может быть в коротком или длинном формате, а номер даты может быть с или без начальный ноль.
Также действителен в "современных браузерах" (или, другими словами, все браузеры, кроме IE9 и ниже)
[Полный год] - [Номер месяца] - [Номер даты] - Месяц и дата. Номер должен содержать начальные нули (это формат, который Тип даты MySQL)
Использование имен месяцев:
Интересно отметить, что при использовании имен месяцев я обнаружил, что используются только первые 3 символа имени месяца, поэтому все из них совершенно верны:
new Date('9 August 2013');
new Date('9 Aug 2013');
new Date('9 Augu 2013');
new Date('9 Augustagfsdgsd 2013');
Пример кода:
var d = new Date();
var time = d.toISOString().replace(/.*?T(\d+:\d+:\d+).*/, "$1");
Вывод:
"13:45:20"
new Date();// = Fri Nov 22 2013 17:48:22 GMT+0100
, вывод с кодом выше будет "16:48:22"
Библиотека 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 от Adam Shaw существует с середины 2011 года и все еще находится в активной развитие. Он имеет фантастическую документацию, отличный API, форматирование, пытается оставаться обратно совместимым и даже поддерживает локализованные строки.
Ссылка на изменение строк локали: https://gist.github.com/1221376
Еще один вариант, который я написал:
Не уверен, что это поможет, но я нашел его полезным в нескольких проектах - похоже, что он сделает то, что вам нужно.
Поддерживает форматирование даты и времени, математику даты (детали добавления/вычитания даты), сопоставление даты, синтаксический анализ и т.д. Это либерально раскрывается.
Нет причин считать это, если вы уже используете фреймворк (все они способны), но если вам просто нужно быстро добавить манипуляции дат в проект, дайте ему шанс.
Самый надежный способ форматирования даты с исходным форматом, который вы используете, заключается в следующем:
новую дату()
для создания объекта Date
.getDate()
, .getMonth()
и .getFullYear()
, чтобы получить соответственно день, месяц и годПример:
var date = '2015-11-09T10: 46: 15.097Z';
формат функции (ввод) {
var date = new Дата (ввод);
вернуть [
( "0" + date.getDate()). Slice (-2),
( "0" + (date.getMonth() + 1)). Slice (-2),
date.getFullYear()
].присоединиться('/');
}
document.body.innerHTML = формат (дата);//OUTPUT: 09/11/2015
(См. также этот скрипт).
Вы также можете использовать встроенный метод .toLocaleDateString
, чтобы сделать форматирование для вас. Вам просто нужно пройти по правильному языку и параметрам в соответствии с правильным форматом, который, к сожалению, поддерживается только современными браузерами (*):
var date = '2015-11-09T10: 46: 15.097Z';
формат функции (ввод) {
return new Date (input).toLocaleDateString('en-GB', {
год: 'числовые',
месяц: "2-значный",
день: '2-значный'
});
}
document.body.innerHTML = формат (дата);//OUTPUT: 09/11/2015
(См. также этот скрипт).
(*) В соответствии с MDN "Современные браузеры" означает Chrome 24+, Firefox 29+, IE11, Edge12 +, Opera 15+ и Safari ночная сборка
используйте эти функции
toTimeString() and toLocaleDateString()
см. ссылку ниже для более подробной информации https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Если вы хотите показывать только время с двумя цифрами, это может помочь вам:
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);
Правильный способ форматирования даты для возвращения "2012-12-29" - это script из Формат даты JavaScript:
var d1 = new Date();
return d1.format("dd-m-yy");
Этот код НЕ работает:
var d1 = new Date();
d1.toString('yyyy-MM-dd');
Если вам не нужны все функции, которые предоставляет библиотека 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 answer:
* http://stackoverflow.com/questions/8619879/javascript-calculate-the-day-of-the-year-1-366
*
* Week number (%V) code based on Taco van den Broek 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
JsSimpleDateFormat - это библиотека, которая может форматировать объект даты и анализировать форматированную строку обратно на объект Date. Он использует формат Java (класс SimpleDateFormat). Название месяцев и дней может быть локализовано.
Пример:
var sdf = new JsSimpleDateFormat("EEEE, MMMM dd, yyyy");
var formattedString = sdf.format(new Date());
var dateObject = sdf.parse("Monday, June 29, 2009");
d = Date.now();
d = new Date(d);
d = (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getFullYear()+' '+(d.getHours() > 12 ? d.getHours() - 12 : d.getHours())+':'+d.getMinutes()+' '+(d.getHours() >= 12 ? "PM" : "AM");
console.log(d);
//pull the last two digits of the year
console.log(new Date().getFullYear().toString().substr(2,2));
JavaScript:
//A function for formatting a date to MMddyy
function formatDate(d)
{
//get the month
var month = d.getMonth();
//get the day
var day = d.getDate();
//get the year
var year = d.getFullYear();
//pull the last two digits of the year
year = year.toString().substr(2,2);
//increment month by 1 since it is 0 indexed
month = month + 1;
//converts month to a string
month = month + "";
//if month is 1-9 pad right with a 0 for two digits
if (month.length == 1)
{
month = "0" + month;
}
//convert day to string
day = day + "";
//if day is between 1-9 pad right with a 0 for two digits
if (day.length == 1)
{
day = "0" + day;
}
//return the string "MMddyy"
return month + day + year;
}
var d = new Date();
console.log(formatDate(d));
Мы можем сделать это вручную, это довольно просто и просто.
var today = new Date();
alert("today :"+today);
var dd = today.getDate();
alert("dd :"+dd);
var mm = today.getMonth()+1; //January is 0!
alert("mm :"+mm);
var yyyy = today.getFullYear();
alert("yyyy :"+yyyy);
var hh = today.getHours();
alert("hh :"+hh);
var min = today.getMinutes();
alert("min :"+min);
var ss = today.getSeconds();
alert("ss :"+ss);
if(dd<10) {
dd='0'+dd
}
if(mm<10) {
mm='0'+mm
}
// today = mm+'/'+dd+'/'+yyyy;
// if you want / instead - then add /
today = yyyy + "-" + mm + "-" + dd + " " + hh + ":" + mm + ":" + ss;
today = yyyy + "/" + mm + "/" + dd + " " + hh + ":" + mm + ":" + ss;
// use according to your choice
См. dtmFRM.js. Если вы знакомы с строкой формата даты и времени С#, эта библиотека должна делать то же самое.
DEMO:
var format = new dtmFRM();
var now = new Date().getTime();
$('#s2').append(format.ToString(now,"This month is : MMMM") + "</br>");
$('#s2').append(format.ToString(now,"Year is : y or yyyy or yy") + "</br>");
$('#s2').append(format.ToString(now,"mm/yyyy/dd") + "</br>");
$('#s2').append(format.ToString(now,"dddd, MM yyyy ") + "</br>");
$('#s2').append(format.ToString(now,"Time is : hh:mm:ss ampm") + "</br>");
$('#s2').append(format.ToString(now,"HH:mm") + "</br>");
$('#s2').append(format.ToString(now,"[ddd,MMM,d,dddd]") + "</br></br>");
now = '11/11/2011 10:15:12' ;
$('#s2').append(format.ToString(now,"MM/dd/yyyy hh:mm:ss ampm") + "</br></br>");
now = '40/23/2012'
$('#s2').append(format.ToString(now,"Year is : y or yyyy or yy") + "</br></br>");
Хотя JavaScript дает вам много отличных способов форматирования и вычислений, я предпочитаю использовать библиотеку Moment.js(momentjs.com) во время разработки приложения, поскольку он очень интуитивно понятен и экономит много времени.
Тем не менее, я предлагаю всем ознакомиться с базовым JavaScript API для лучшего понимания.
Многие фреймворки (которые вы уже можете использовать) имеют форматирование даты, о которых вы, возможно, и не подозреваете. jQueryUI уже упоминался, но другие структуры, такие как Kendo UI (глобализация), Yahoo UI (Util) и AngularJS имейте в виду.
// 11/6/2000
kendo.toString(new Date(value), "d")
// Monday, November 06, 2000
kendo.toString(new Date(2000, 10, 6), "D")
Лично, потому что я использую как PHP, так и jQuery/javascript в равных измерениях, я использую функцию даты из php.js http://phpjs.org/functions/date/
Использование библиотеки, которая использует те же строки формата, что и я уже знаю, мне проще, и руководство, содержащее все возможности строки формата для функции даты, конечно, находится в режиме онлайн на php.net
Вы просто включаете файл date.js в свой HTML, используя свой предпочтительный метод, затем вызывайте его следующим образом:
var d1=new Date();
var datestring = date('Y-m-d', d1.valueOf()/1000);
Вы можете использовать d1.getTime() вместо valueOf(), если хотите, они делают то же самое.
Деление на 1000 временных меток javascript связано с тем, что метка времени javascript находится в миллисекундах, но временная метка PHP находится в секундах.
Ответ "нигде", поскольку форматирование даты - это собственная функциональность. Я не думаю, что функции 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");
}