Где я могу найти документацию по форматированию даты в JavaScript?

1297

Я заметил, что функция 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()?

  • 162
    ваши примеры на самом деле не работают так, как вы думаете: jsfiddle.net/edelman/WDNVk/1
  • 26
    Извините, передача строк формата в toString работает в .NET и может работать в Java, но, как отметил Джейсон, в Javascript это на самом деле не работает.
Показать ещё 6 комментариев
Теги:
datetime
date
date-format
time-format

35 ответов

1062
Лучший ответ

Мне нравится 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);
  • 26
    Оба этих сайта имеют ограниченные лицензии. Так что если вы используете код (без разрешения), вы будете нарушать. Momentjs ( stackoverflow.com/a/10119138/278976 ) выглядит как лучший вариант и является лицензией MIT.
  • 1
    @McKay вопрос, специально заданный о форматах строк, нестандартная функция JS
Показать ещё 11 комментариев
704

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.3KB, minified + gzipped в наименьшей возможной настройке (feb 2014)

  • 7
    Это также обеспечивает шаблон декоратора вокруг объекта Date вместо обезьяны, пробивающей основной объект, так что у вас меньше шансов получить конфликты в будущем.
  • 4
    Я не думаю, что когда-либо сталкивался с библиотекой в каком-либо языке / среде программирования, которая так идеально подходит для этой цели. Кроме того, документы обширны и действительно очень хороши. Действительно рад, что нашел это, потому что с датами было трудно иметь дело в прошлом (хотя Datejs несколько улучшил ситуацию для меня).
Показать ещё 11 комментариев
438

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

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

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

Посмотрите jQuery UI datepicker formatDate, примеры.

  • 0
    как сказать это использовать местное время или зулу?
  • 7
    Я предпочитаю использовать это решение, способное получить время без какой-либо библиотеки: new Date (). toTimeString (). match (/ ^ ([0-9] {2}: [0-9] {2}: [0-9] ] {2}) /) [0] К вашему сведению
Показать ещё 5 комментариев
226

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

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

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

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

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

  • 26
    MDN также является отличным справочником: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 2
    Мой ответ попытался ответить и на этот вопрос. Я действительно считаю, что браузеры Firefox или Mozilla когда-то предоставили метод Date.toString (), который принял такую строку форматирования. К сожалению, я не могу найти никаких следов старой документации. Он больше не является частью стандарта и, похоже, больше нигде не поддерживается, даже в Firefox.
199

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

Для фиксированных форматов простую функцию выполняет задание. В следующем примере создается международный формат ГГГГ-ММ-ДД:

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:

Начиная с более поздних версий 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
  • 10
    Должен быть принят ответ, потому что он дает требуемый формат (01-01-2000, а не 1-1-2000)
  • 6
    new Date (). toISOString (). slice (0,10) // "2015-04-27"
Показать ещё 3 комментария
127

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

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

  • Слова перед тем, как первое число, неизвестное синтаксическому анализатору, игнорируется.
  • Воспроизведение в скобках игнорируется.
  • Беззнаковые числа, за которыми следуют ":", интерпретируются как "компонент времени".
  • Беззнаковые числа, за которыми следует "." интерпретируются как "компонент времени" и должны сопровождаться миллисекундами.
  • Подписанные номера, за которыми следует часовой или час (например, +5: 15 или +0515), интерпретируются как часовой пояс.
  • При объявлении часа и минуты вы можете использовать "hh: mm" или "hhmm".
  • Слова, указывающие часовой пояс, интерпретируются как часовой пояс.
  • Все остальные номера интерпретируются как "компоненты даты".
  • Все слова, начинающиеся с первых трех цифр месяца, интерпретируются как месяц.
  • Вы можете определить минуты и часы вместе в любом из двух форматов: "hh: mm" или "hhmm".
  • Символы типа "+", "-" и непревзойденные ")" не разрешены после обработки номера.
  • Элементы, которые соответствуют нескольким форматам (например, 1970-01-01), обрабатываются как стандартная строка стандарта ISO 8601 EMCAScript 5.0.

Итак, этого должно быть достаточно, чтобы дать вам общее представление о том, что ожидать, когда дело доходит до передачи строки в объект 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. Довольно загруженный вопрос, когда вы думаете об этом, да?: 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

95

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

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

  • 1
    Это фантастическая библиотека. Я создал свою собственную версию, но я отказался от этого проекта в пользу его использования. Спасибо за ссылку !!!! (Можете ли вы сказать, что я взволнован)
  • 1
    +1 за использование уже существующей хорошей библиотеки вместо наполовину испеченного решения
Показать ещё 12 комментариев
64

Вы можете просто расширить объект 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"));
  • 0
    Немного улучшено для поддержки AM / PM - см. Ниже
  • 0
    @WHK Но мне все еще нравятся моменты : D
Показать ещё 5 комментариев
36

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

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

  • 5
    Попытка ответить на вопрос на самом деле не даст вам много голосов. Просто номинируйте популярную библиотеку и смотрите, как ваш счет летит!
29

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

  • 4
    Мне нравится этот класс, но я думаю, что это должен быть "статический" класс. Нет необходимости создавать его более одного раза. (не должен нуждаться в new DateFmt() )
  • 1
    Cheeso: Что делать, если я хочу отформатировать 10 разных дат на странице 3 разными способами, каждый? В этом случае было бы полезно иметь три экземпляра этого форматера. Это вполне допустимый сценарий использования, который исключает это. ОП спроектировал это правильно. Кроме того, указание формата во время построения экономит дублирование кода, так как каждый раз, когда вам нужно, он форматируется определенным образом.
28

Рамка свободная, ограниченная, но легкая

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"
  • 0
    это кросс-браузер? и кросс локаль?
  • 0
    Да. Показывает время в вашем часовом поясе (пользователь браузера).
22

DateJS, безусловно, полнофункциональный, но я бы рекомендовал этот БОЛЬШЕ более простой lib (формат даты JavaScript), который я предпочитаю просто потому, что он составляет всего 120 строк.

  • 0
    Ссылки на исходный код в связанной статье мертвы, но, к счастью, кто-то поместил его на Github: github.com/rvanbaalen/date-steroids
17

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

/**
* 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"));
  • 2
    Операции замены не очень эффективны, поэтому лучше не допускать этого.
  • 0
    что если я напишу, что произойдет? console.log («Дата:» + dateFormat (new Date (), «DD / MM / YY»));
Показать ещё 2 комментария
10

Здесь функция, которую я использую много. Результат: 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);
}
  • 1
    хороший ответ, но я думаю, что вы должны изменить функцию zp2 следующим образом: var zp2 = function (val) {return val <= 9? '00' + val: (val <= 99? '0' + val: '' + val); }
  • 1
    есть исключение, когда значение ms part равно 0, это не то же самое, в вашей функции результат равен «00», но не «000».
9

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

Примечание:

  • Он использует Object.keys(), который undefined в старых браузерах, поэтому вам может понадобиться реализовать polyfill из данной ссылки.

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
8

Просто, чтобы продолжить 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;
}
  • 0
    Очень хорошее решение! var a = новая дата (); a.format ( 'YYYY-MM-d'); // Возврат 2013-08-16.
  • 0
    this.getMonth (); не удается в iOS
7

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

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
  • 2013 Aug 09
  • 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');
6

Пример кода:

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

Вывод:

"13:45:20"

  • 2
    Стоит отметить с toISOString (); это выводит UTC. Так что, если new Date();// = Fri Nov 22 2013 17:48:22 GMT+0100 , вывод с кодом выше будет "16:48:22"
6

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

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

javascript-библиотека XDate от Adam Shaw существует с середины 2011 года и все еще находится в активной развитие. Он имеет фантастическую документацию, отличный API, форматирование, пытается оставаться обратно совместимым и даже поддерживает локализованные строки.

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

3

Еще один вариант, который я написал:

Библиотека DP_DateExtensions

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

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

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

2

Все браузеры

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

  • Используйте новую дату() для создания объекта 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 ночная сборка

2

используйте эти функции

toTimeString() and toLocaleDateString()

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

2

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

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

Правильный способ форматирования даты для возвращения "2012-12-29" - это script из Формат даты JavaScript:

var d1 = new Date();
return d1.format("dd-m-yy");

Этот код НЕ работает:

var d1 = new Date();
d1.toString('yyyy-MM-dd');      
  • 3
    вам нужен скрипт, связанный с «JavaScript Date Format», который связан выше
1

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

1

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

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

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

//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

Мы можем сделать это вручную, это довольно просто и просто.

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 
  • 0
    Просто небольшой комментарий, это не «чч +»: «+ мм +»: «+ сс;» но 'чч + ":" + мин + ":" + сс; " :)
0

См. 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>");
0

Хотя JavaScript дает вам много отличных способов форматирования и вычислений, я предпочитаю использовать библиотеку Moment.js(momentjs.com) во время разработки приложения, поскольку он очень интуитивно понятен и экономит много времени.

Тем не менее, я предлагаю всем ознакомиться с базовым JavaScript API для лучшего понимания.

  • 0
    Это также невероятно раздутый.
0

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

Лично, потому что я использую как 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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню