it-roy-ru.com

Где я могу найти документацию по форматированию даты в 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() на объекте date, и удивительно, что он служит для форматирования даты в строки.

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()?

1351
Naga Kiran

Я люблю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);

1034
Haim Evgi

Moment.js

Это (облегченная) * библиотека дат 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 г.) 

675
chx007

Если вы уже используете jQuery UI в своем проекте, вы можете использовать встроенный метод datepicker для форматирования объекта даты:

$.datepicker.formatDate('yy-mm-dd', new Date(2007, 1 - 1, 26));

Однако средство выбора даты только форматирует даты и не может форматировать время.

Взгляните на jQuery UI datepicker formatDate , примеры.

422
casid

Где находится документация, в которой перечислены спецификаторы формата, поддерживаемые объектом Date()?

Я наткнулся на это сегодня и был весьма удивлен, что никто не нашел время, чтобы ответить на этот простой вопрос. Правда, есть много библиотек, которые могут помочь с манипулированием датами. Некоторые лучше, чем другие. Но этот вопрос не задавался.

AFAIK, чистый JavaScript не поддерживает спецификаторы формата так, как вы указали, вы хотели бы использовать их. Но он поддерживает методы форматирования дат и/или времени, такие как .toLocaleDateString(), .toLocaleTimeString() и .toUTCString().

Ссылка на объект Date, которую я чаще всего использую, находится на веб-сайт w3schools.com (но быстрый поиск в Google покажет гораздо больше, которые могут лучше соответствовать вашим потребностям).

Также обратите внимание, что в разделе Date Object Properties содержится ссылка на prototype , которая иллюстрирует некоторые способы расширения объекта Date с помощью пользовательских методов. На протяжении многих лет в сообществе JavaScript было некоторые споры о том, является ли это наилучшей практикой, и я не защищаю ее или не против, а просто указываю на ее существование.

217
Scott Offen

Пользовательская функция форматирования:

Для фиксированных форматов, простая функция сделать работу. В следующем примере создайте международный формат 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#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
204
Adrian Maire

Краткий ответ

Нет «универсальной» документации, которая бы обслуживала javascript; каждый браузер с javascript действительно является реализацией. Тем не менее, существует стандарт, которому склонны следовать большинство современных браузеров, и это стандарт EMCAScript; Стандартные строки ECMAScript будут принимать, как минимум, модифицированную реализацию определения ISO 8601.

В дополнение к этому есть/второй стандарт, установленный IETF , которым также стремятся следовать браузеры, это определение для временных меток, сделанное в RFC 2822. Актуальную документацию можно найти в списке ссылок внизу.

От этого вы можете ожидать базовой функциональности, но то, что «должно» быть, не является тем, что «есть». Я собираюсь немного углубиться в это с процедурной точки зрения, хотя, как представляется, только три человека фактически ответили на вопрос (а именно Скотт, goofballLogic и Пеллер), который, для меня, предполагает, что большинство людей не знают, что на самом деле происходит, когда вы создать объект Date.


Длинный ответ

Где находится документация, в которой перечислены спецификаторы формата, поддерживаемые объектом Date ()?


Чтобы ответить на вопрос или, как правило, даже искать ответ на этот вопрос, вам нужно знать, что javascript не является новым языком; на самом деле это реализация ECMAScript и соответствует стандартам ECMAScript (но обратите внимание, что javascript также предшествовал этим стандартам; стандарты EMCAScript построены на ранней реализации LiveScript/JavaScript). Текущий стандарт ECMAScript - 5.1 (2011); в то время, когда вопрос был задан изначально (июнь 2009 г.), стандартом было 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 (), он будет вызывать прототип (обратите внимание, что я свободно использую Word prototype; версии могут быть отдельными функциями или частью условного оператора). в одной функции) для новая дата (значение) с вашей строкой в ​​качестве аргумента для параметра «значение». Эта функция сначала проверит, является ли это число или строка. Документацию по этой функции можно найти здесь:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2

Из этого мы можем сделать вывод, что для получения разрешенного форматирования строки для новой даты (значения) мы должны взглянуть на метод Date.parse (строка). Документацию по этому методу можно найти здесь:

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

Однако из опыта мы можем понять, что объект 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 и, если он не соответствует стандартам, попытается построить дату на основе устаревших форматов. Несколько ключевых моментов, основанных на комментариях:

  1. Слова перед первым числом, которые неизвестны парсеру, игнорируются.
  2. Заключенный в скобки текст игнорируется.
  3. Числа без знака, за которыми следует «:», интерпретируются как «компонент времени».
  4. Числа без знака, за которыми следует «.», Интерпретируются как «компонент времени» и должны сопровождаться миллисекундами.
  5. Подписанные числа, за которыми следуют час или часовая минута (например, +5: 15 или +0515), интерпретируются как часовой пояс.
  6. При указании часов и минут вы можете использовать «чч: мм» или «ччмм».
  7. Слова, обозначающие часовой пояс, интерпретируются как часовой пояс.
  8. Все остальные числа интерпретируются как «компоненты даты».
  9. Все слова, которые начинаются с первых трех цифр месяца, интерпретируются как месяц.
  10. Вы можете определить минуты и часы вместе в любом из двух форматов: «чч: мм» или «ччмм».
  11. Такие символы, как «+», «-» и «без совпадения») не допускаются после обработки числа.
  12. Элементы, которые соответствуют нескольким форматам (например, 1970-01-01), обрабатываются как стандартная строка EMCAScript 5.0 ISO 8601.

Так что этого должно быть достаточно, чтобы дать вам общее представление о том, чего ожидать, когда дело доходит до передачи строки в объект Date. Более подробно об этом вы можете узнать из следующей спецификации, на которую указывает Mozilla в сети разработчиков Mozilla (соответствует меткам времени IETF RFC 2822):

http://tools.ietf.org/html/rfc2822#page-14

В Microsoft Developer Network дополнительно упоминается дополнительный стандарт для объекта Date: ECMA-402, спецификация API интернационализации ECMAScript, которая дополняет стандарт ECMAScript 5.1 (и будущие). Это можно найти здесь:

http://www.ecma-international.org/ecma-402/1.0/

В любом случае это должно помочь подчеркнуть, что не существует «документации», которая повсеместно представляет все реализации javascript, но все еще имеется достаточно документации, чтобы разумно понять, какие строки приемлемы для объекта Date. Довольно загруженный вопрос, когда вы думаете об этом, да? :П

Отзывы

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

123
Sg'te'gmuj

Убедитесь, что вы извлекаете Datejs при работе с датами в JavaScript. Это довольно впечатляюще и хорошо документировано, как вы можете видеть в случае функции toString .

EDIT: Тайлер Форсит указывает, что дата устарела. Я использую его в своем текущем проекте, и у меня не было никаких проблем, однако вы должны знать об этом и рассмотреть альтернативы.

92
Tim Büthe

Вы можете просто расширить объект 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"));
68
gongzhitaao

Функциональность, которую вы цитируете, не является стандартным Javascript, вряд ли будет переносимой через браузеры и поэтому не является хорошей практикой. Спецификация ECMAScript 3 оставляет функцию синтаксического анализа и выходных форматов вплоть до реализации Javascript. ECMAScript 5 добавляет подмножество поддержки ISO8601. Я считаю, что функция toString (), которую вы упоминаете, является новшеством в одном браузере (Mozilla?)

Несколько библиотек предоставляют подпрограммы для параметризации, некоторые с расширенной поддержкой локализации. Вы также можете проверить методы в dojo.date.locale .

36
peller

Я сделал этот очень простой форматтер, он вырезан/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())

http://snipplr.com/view/66968.82825/

30
Lyndon S

Каркас бесплатный, ограниченный, но легкий

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"
29
John Williams

DateJS, безусловно, полнофункциональный, но я бы порекомендовал это НАМНОГО более простая библиотека (JavaScript Date Format) которую я предпочитаю просто, потому что это всего 120 строк или около того.

22
Eric Wendelin

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

/**
* 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"));
17
Ollie Bennett

Вот функция, которую я часто использую. Результат: гггг-мм-дд чч: мм: сс.ннн.

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);
}
11
Carl

Вы можете найти полезной эту модификацию объекта date, которая меньше любой библиотеки и легко расширяется для поддержки различных форматов:

ПРИМЕЧАНИЕ:

  • Он использует 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
9
Vaclav

Просто чтобы продолжить твердый ответ 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;
}
8
Michael Angstadt

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

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');
7
Pete Newnham

Библиотека 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"
6
andersh

Форматирование и особенно разбор дат в JavaScript может быть немного головной болью. Не все браузеры обрабатывают даты одинаково. Поэтому, хотя полезно знать базовые методы, более практично использовать вспомогательную библиотеку.

Библиотека JDascript XDate by Адам Шоу существует с середины 2011 года и все еще находится в стадии активной разработки. Он имеет фантастическую документацию, отличный API, форматирование, пытается оставаться обратно совместимым и даже поддерживает локализованные строки.

Ссылка на изменение строки локали: https://Gist.github.com/1221376

6
Sam Lown

Пример кода:

var d = new Date();
var time = d.toISOString().replace(/.*?T(\d+:\d+:\d+).*/, "$1");

Результат:

"13:45:20"

6
Nery Jr

Все браузеры

Самый надежный способ форматирования даты с использованием исходного формата, который вы используете, - это выполнить следующие шаги:

  1. Используйте new Date() для создания объекта Date
  2. Используйте .getDate(), .getMonth() и .getFullYear(), чтобы получить соответственно день, месяц и год
  3. Вставьте части вместе в соответствии с вашим целевым форматом

Пример :

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

(См. Также это Fiddle ).


Только современные браузеры

Вы также можете использовать встроенный метод .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

(См. Также это Fiddle ).


(*) Согласно MDN , «современные браузеры» означают Chrome 24+, Firefox 29+, IE11, Edge12 +, Opera 15+ & Safari ночная сборка

5
John Slegers

Просто еще один вариант, о котором я написал:

Библиотека DP_DateExtensions

Не уверен, что это поможет, но я нашел это полезным в нескольких проектах - похоже, он будет делать то, что вам нужно.

Поддерживает форматирование даты/времени, математику даты (сложение/вычитание частей даты), сравнение даты, разбор даты и т.д. Это свободно открытый источник.

Нет смысла это учитывать, если вы уже используете фреймворк (они все способны), но если вам просто нужно быстро добавить манипуляции с датами в проект, дайте ему шанс.

3
Jim Davis

использовать эту функцию

toTimeString() and toLocaleDateString()

см. ссылку ниже для получения дополнительной информации https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

2
nidhin

Если вы хотите показать только время с двумя цифрами, это может помочь вам:

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);
2
Usman Younas

Правильный способ форматирования даты для возврата «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');      
2
Sebastian Viereck

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");
1
Peter

Ответ - «никуда», поскольку форматирование даты является проприетарной функциональностью. Я не думаю, что функции 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");
}
1
goofballLogic

Если вам не нужны все функции, которые предоставляет библиотека, например 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://stackoverflow.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

1
thdoan

Лично, поскольку я использую и 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 - в секундах.

0
Cloudranger

Конкретный ответ на этот вопрос находится в следующих двух строках:

//pull the last two digits of the year
console.log(new Date().getFullYear().toString().substr(2,2));

Пример форматирования полной даты и времени (MMddyy): jsFiddle

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));

0
abc123

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);

0
Cris

Многие фреймворки (которые вы, возможно, уже используете) имеют форматирование даты, о котором вы можете не знать. 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")
0
ProVega

Смотрите dtmFRM.js . Если вы знакомы с пользовательской строкой формата даты и времени в C #, эта библиотека должна делать то же самое.

ДЕМО :

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>");
0
Mina Gabriel