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


1399

Я заметил, что new Date()функция JavaScript очень умна в приеме дат в нескольких форматах.

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()объектом?


165
ваши примеры на самом деле не работают так, как вы думаете: jsfiddle.net/edelman/WDNVk/1
Джейсон

27
К сожалению, передача строк формата в toString работает в .NET, и это может работать в Java, но, как отметил Джейсон, в Javascript это на самом деле не работает.
Джошуа Кармоди

12
Люди помнят - вопросы, какими бы каноничными они ни были, должны оставаться вопросами . Пожалуйста, воздержитесь от любых правок, которые превращают этот вопрос в ответ, уточните и сохраните ответы . Спасибо :)
Тим Пост

1
Я использовал код в этой ссылке msdn.microsoft.com/en-us/library/ie/ff743760(v=vs.94).aspx - (date.toLocaleDateString ("en-US"));
Халед Аннажар

Если будущие посетители этой страницы смущены тем, как большинство ответов относятся к вопросу, я предлагаю прочитать редакции вопроса , особенно (если они отличаются от вышеуказанных), ревизию 15 @ Эрик Муйсер - меня, например, смутило отсутствие недействительного Date # toString use.
user66001

Ответы:


1063

Мне нравятся 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);


27
Оба этих сайта имеют ограниченные лицензии. Так что если вы используете код (без разрешения), вы будете нарушать. Momentjs ( stackoverflow.com/a/10119138/278976 ) выглядит как лучший вариант и является лицензией MIT.
Homer6

4
@peller Этот ответ отвечает на вопрос "Как мне отформатировать даты в javascript?" который фактически является названием вопроса. В сущности вопроса он весьма обманчив. И, на ваш взгляд, этот ответ не говорит о форматировании строк с использованием случайных нестандартных или не упомянутых библиотек. Но эта часть вопроса была задана неправильно, как отмечено в комментарии № 1 к вопросу. Таким образом, это отвечает на реальный вопрос, но не на строки формата, которые на самом деле не существуют.
МакКей

3
@McKay; это был не вопрос. Я думаю, что вы либо неправильно понимаете, о чем просит пеллер, либо тупите в своих рассуждениях.
codeinthehole

10
@codeinthehole "Форматирование дат в Javascript" это вопрос. «до сих пор у меня сложилось впечатление, что в JavaScript нет встроенного API для форматирования объекта даты в строку». но затем говорит о поведении, которое, я думаю, он считает родным в javascript. Не зная, на какую библиотеку он ошибочно ссылается, я думаю, что лучше всего предположить, что он задает вопрос: «Как мне отформатировать даты в javascript?» и я не думаю, что я делаю дикие прыжки.
МакКей

5
ММ означает 01-12, а не 1-12: 2013-04-17 => ОК 2013-4-17 => ПЛОХО
Адриан Мэйр

678

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 г.)


7
Это также обеспечивает шаблон декоратора вокруг объекта Date вместо обезьяны, пробивающей основной объект, так что у вас меньше шансов получить конфликты в будущем.
Гейб Мартин-Демпси

120
Пожалуйста, прекратите злоупотреблять словом «легкий». Даже 5 КБ смехотворно велики для такой функциональности, и на сегодняшний день этот размер увеличился до 19 КБ.
user123444555621

27
@ Pumbaa80 Я не согласен с тем, что «Даже 5 КБ смехотворно велики для такой функциональности». Вы видели документы? Это чрезвычайно полезная библиотека для работы с датами в JS. Я понимаю, что наличие библиотеки, превышающей пару КБ, для однократного использования базового формата, такого как "D / M / Y", может быть немного излишним, однако различия в несколько КБ становятся незначительными, тогда простота использования библиотеки обеспечивает , Сопровождаемый код - это хорошая вещь ради нескольких килобайт. Если бы это было минимизировано + 100 КБ, я согласился бы.
Turnerj

15
@Tumerj утверждает, что это полезно, не делает ничего, чтобы решить проблему легкости. Два не связаны.
JoshJordan

9
Вы не можете сделать реактивный самолет более легким, снимая двигатель, потому что тогда он становится планером, а не струей. Легкий означает, что что-то имеет только необходимые функциональные возможности для выполнения указанной функции. Ergo, это легкое решение.
Бон

425

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

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

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

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


как сказать это использовать местное время или зулу?
Устаман Сангат

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

Есть ли способ сделать это. $ .datepicker.formatDate ( 'уу-мм-дд', новая дата ( "txtAdvDate" .val ()), или некоторые вещи , как это
Помстер

@Pomster - что заставило бы вас думать, что строка "txtAdvDate" будет иметь метод val? Вы имеете в виду $ ('# txtAdvDate'). Val ()? Предполагая, что он подходит одному из конструкторов (см. Здесь w3schools.com/jsref/jsref_obj_date.asp ), тогда это будет работать просто отлично.
vbullinger

@Pomster - попробуйте использовать это: document.getElementById (id) .value = $ .datepicker.formatDate ('yy-mm-dd', new Date ());
mrrsb

219

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

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

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

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

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


26
MDN также является отличным справочником: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Cypher

2
Мой ответ попытался ответить и на этот вопрос. Я верю, что браузеры Firefox или Mozilla однажды предоставили метод Date.toString (), который принял такую ​​строку форматирования. К сожалению, я не могу найти никаких следов старой документации. Он больше не является частью стандарта и, похоже, больше нигде не поддерживается, даже в Firefox.
Пеллер

214

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

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

10
Должен быть принят ответ, потому что он дает требуемый формат (01-01-2000, а не 1-1-2000)
Дунайский моряк

6
new Date (). toISOString (). slice (0,10) // "2015-04-27"
image72

2
Было бы очень полезно не иметь пример с 11 сентября, чтобы было ясно, в какой позиции представлены день и месяц.
Карл Адлер

1
@abimelex сделано. Надеюсь, теперь стало понятнее.
Адриан Мэр

1
спасибо за добавление ссылок на источник (: - см. также developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… и developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…
Сандра

125

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

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

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

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


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

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


Чтобы ответить на вопрос или, как правило, даже искать ответ на этот вопрос, вам нужно знать, что javascript не является новым языком; на самом деле это реализация ECMAScript и соответствует стандартам ECMAScript (но обратите внимание, javascript также предшествовал этим стандартам; стандарты EMCAScript построены на ранней реализации LiveScript / JavaScript). Текущий стандарт ECMAScript - 5.1 (2011); в то время, когда вопрос был задан изначально (июнь '09), стандартом было 3 (4 было отменено), но 5 было выпущено вскоре после публикации в конце 2009 года. Это должно обозначить одну проблему; какой стандарт может следовать реализация javascript, может не отражать то, что на самом деле на месте, потому что а) это реализация данного стандарта, б) не все реализации стандарта являются пуританскими,

По сути, когда вы имеете дело с javascript, вы имеете дело с производной (специфичной для браузера javascript) реализации (сам javascript). Например, в Google V8 реализован ECMAScript 5.0, но JScript Internet Explorer не пытается соответствовать какому-либо стандарту ECMAScript, однако Internet Explorer 9 действительно соответствует ECMAScript 5.0.

Когда одиночный аргумент передается в новый Date (), он вызывает этот прототип функции:

new Date(value)

Когда два или более аргумента передаются в новый Date (), он вызывает этот прототип функции:

new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )


Обе эти функции должны выглядеть знакомо, но это не сразу отвечает на ваш вопрос, и то, что количественно определяется как приемлемый «формат даты», требует дальнейшего объяснения. Когда вы передаете строку в новый Date (), он вызывает прототип (обратите внимание, что я свободно использую слово prototype ; версии могут быть отдельными функциями или частью условного оператора в одной функции) для новая Дата (значение) с вашей строкой в ​​качестве аргумента для параметра «значение». Эта функция сначала проверит, является ли это число или строка. Документацию по этой функции можно найти здесь:

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


92

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

РЕДАКТИРОВАТЬ : Тайлер Форсайт указывает, что datejs устарела. Я использую его в своем текущем проекте, и у меня не было никаких проблем, однако вы должны знать об этом и рассмотреть альтернативы.


2
Я не смог найти способ кормить datejs миллисекундами для создания даты. Вот так: var dateTime = new Date (); dateTime.setTime (миллисекунды);
Арне Эвертссон

14
25k? Просто на свидания? Уч.
Бен Леш

13
Datejs - устаревшая библиотека, которая не развивалась в течение 5 лет. Их источник находится на Github и Google Code, последние даты обновлены в 2008 году (это 2013). Ради вашего здравого смысла, используйте XDate или Moment.js.
Тайлер Форсайт

3
@TylerForsythe я добавил подсказку / предупреждение об этом.
Тим Бюте

2
LOL дата сценария устарела ...
rtpHarry

69

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

Немного
улучшен

@WHK Но мне все еще нравятся моменты : D
gongzhitaao

Возникли проблемы при захвате месяца: new Date ((new Date ()). Format ('yyyy-MM-dd')) return май, но теперь июнь: - / whoto использовать часовой пояс в строке разбора?
e-info128

1
@WHK Это на самом деле очень примитивный парсер дат. На всякий случай, если вам не нужно слишком много связываться с датой. Если вам действительно нужно справиться с различными форматами дат, я бы порекомендовал отдельную библиотеку, такую ​​как momentjs. : D
gongzhitaao

1
@WHK Потому что console.log(new Date('2014-06-01')) -> Mayя думаю, что это как-то связано с
часовым поясом

37

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

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


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

30

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

1
Cheeso: Что делать, если я хочу отформатировать 10 разных дат на странице 3 разными способами, каждый? В этом случае было бы полезно иметь три экземпляра этого форматера. Это вполне допустимый сценарий использования, который это исключает. ОП спроектировал это правильно. Кроме того, указание формата во время построения экономит дублирование кода при указании формата каждый раз, когда вам нужно отформатировать его определенным образом.
hsanders

29

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

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"

это кросс-браузер? и кросс локаль?
Ифта

Да. Показывает время в вашем часовом поясе (пользователь браузера).
Джон Уильямс

22

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


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

18

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

/**
* 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
Операции замены не очень эффективны, поэтому лучше не допускать этого.
mrzmyr

что если я напишу, что произойдет? console.log («Дата:» + dateFormat (new Date (), «DD / MM / YY»));
Хакан

1
Будет напечатан текст «Дата: 12/11 / ГГ», потому что выше не обрабатываются двухзначные даты. Если вам нужно это, вы могли бы добавить сразу после до возвращения заявления: format = format.replace("YY", (""+date.getFullYear()).substring(2));. Это становится уродливым - вы, вероятно, хотите пойти по маршруту RegEx или подобному.
Олли Беннетт

1
@mrzmyr Вы действительно думаете, что форматирование дат будет узким местом производительности? Давай.
doug65536

11

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

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

КОД

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

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

Очень хорошее решение! var a = новая дата (); a.format ( 'YYYY-MM-d'); // Возврат 2013-08-16.
Адриан Мэйр

this.getMonth (); не работает в iOS
N20084753

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

Любая комбинация [Полный год], [Имя месяца] и [Номер даты], разделенных пробелами - Название месяца может быть в коротком или длинном формате, а номер даты может быть с или без начального нуля.

  • 09 августа 2013
  • Август 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');

6

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

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

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


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"
Tewr

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"

4

Все браузеры

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

  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

(Смотрите также эту скрипку ).


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

Вы также можете использовать встроенный .toLocaleDateStringметод для форматирования. Вам просто нужно указать правильную локаль и параметры, соответствующие правильному формату, который, к сожалению, поддерживается только современными браузерами (*) :

var date = '2015-11-09T10:46:15.097Z';

function format(input) {
    return new Date(input).toLocaleDateString('en-GB', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
    });
}

document.body.innerHTML = format(date); // OUTPUT : 09/11/2015

(Смотрите также эту скрипку ).


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


3

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

Библиотека DP_DateExtensions

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

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

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


1
Я предполагаю, что новый URL будет depressedpress.com/javascript-extensions/dp_dateextensions
torvin

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


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

1

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

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


0

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

3
вам нужен скрипт, связанный с «JavaScript Date Format», на который вы ссылались выше
Себастьян Вирек

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

Многие фреймворки (которые вы, возможно, уже используете) имеют форматирование даты, о котором вы можете не знать. 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")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.