Де можна знайти документацію щодо форматування дати в JavaScript? [зачинено]


1397

Я помітив, що 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()методом на об’єкті дати, і на диво він служить метою форматування дати до рядків.

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


164
ваші приклади насправді не працюють так, як ви думаєте: jsfiddle.net/edelman/WDNVk/1
Jason

27
На жаль, передавання рядків формату в toString працює в .NET, і це може працювати в Java, але, як зазначив Джейсон, це фактично не працює в Javascript.
Джошуа Кармоді

12
Люди пам’ятають - питання, як би не були канонічними, повинні залишатися питаннями . Утримайтеся від будь-якої редакції, яка перетворює це запитання на відповідь, уточнюйте та підтримуйте відповіді . Дякую :)
Тим дописом

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

Якщо майбутніх відвідувачів цієї сторінки бентежить те, як більшість відповідей стосується питання, пропоную прочитати доопрацювання питання , особливо (якщо це відрізняється від вище) версії 15 @ Ерік Муйсер - я для одного збентежився відсутністю недійсного Дата # до використання стрічки.
user66001

Відповіді:


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


27
Обидва ці сайти мають обмежувальні ліцензії. Тож якщо ви користуєтесь кодом (без дозволу), ви будете порушувати. Momentjs ( stackoverflow.com/a/10119138/278976 ) виглядає як шлях більш кращий варіант і є ліцензією MIT.
Гомер6,

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

Момент.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 КБ, мінімізований + gzipped у найменшій можливій установці (feb 2014)


7
Це також забезпечує візерунок декоратора навколо об'єкта Date замість того, щоб мавпа пробивала основний об’єкт, тому ви менше шансів отримати конфлікти в дорозі.
Гейб Мартін-Демпесі

120
Будь ласка, перестаньте зловживати словом "легкий". Навіть 5 кбіт смішно великий для такої функціональності, і на сьогоднішній день цей розмір збільшився до 19 кбіт.
користувач123444555621

26
@ Pumbaa80 Я не погоджуюся з тим, що "Навіть 5kb смішно великий за такий функціонал". Ви бачили документи? Це надзвичайно корисна бібліотека для роботи з датами в JS. Я розумію, що наявність бібліотеки, що перевищує пару Кбайт, для одноразового використання базового формату, наприклад "D / M / Y", може бути трохи надмірною, проте відмінності в декілька КБ стають незначними, тоді простота використання бібліотеки забезпечує . Підтримуваний код - це гарна річ заради кількох КБ. Якби це було + 100 КБ мінімізовано, я би погодився.
Турнерж

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

9
Ви не можете зробити реактивний літак більш легким, знявши двигун, тому що він стає планером, а не реактивним. Легкий означає, що щось має лише необхідну функціональність для виконання визначеної функції. Ерго, це полегшене рішення.
Бон

425

Якщо ви вже використовуєте інтерфейс jQuery у своєму проекті, ви можете використовувати вбудований метод вибору дати для форматування об'єкта дати:

$.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] FYI
помітний

є спосіб це зробити. $ .datepicker.formatDate ('yy-mm-dd', нова дата ("txtAdvDate" .Val ()) або щось подібне
Pomster

@Pomster - що б змусило вас думати, що рядок "txtAdvDate" буде мати метод val на ньому? Ви маєте на увазі $ ('# txtAdvDate'). Val ()? Якщо припустити, що він відповідає одному з конструкторів (див. Тут w3schools.com/jsref/jsref_obj_date.asp ), то це спрацювало б чудово.
vbullinger

@Pomster - спробуйте скористатися цим: document.getElementById (id) .value = $ .datepicker.formatDate ('yy-mm-dd', нова дата ());
mrrsb

219

Де знаходиться документація, в якій перераховані специфікатори формату, підтримувані Date()об'єктом?

Я сьогодні натрапив на це і був дуже здивований, що ніхто не знайшов часу, щоб відповісти на це просте запитання. Правда, існує багато бібліотек, які допомагають у маніпуляції датою. Деякі кращі за інших. Але це не було запитання.

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

Посилання на Dateоб'єкт, яким я найчастіше користуюся, перебуває на веб-сайті w3schools.com (але швидкий пошук в Google виявить ще багато, що може краще відповідати вашим потребам).

Також зауважте, що в розділі " Властивості об'єкта дати " передбачено посилання prototype, яке ілюструє деякі способи розширення об'єкта "Дата" за допомогою спеціальних методів. Там були деякі дебати в суспільстві 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 ()?


Щоб відповісти на запитання або, як правило, навіть шукати відповідь на це питання, вам потрібно знати, що javascript - це не нова мова; це насправді реалізація ECMAScript і відповідає стандартам ECMAScript (але зауважте, що JavaScript також фактично попередньо датовані цими стандартами; стандарти EMCAScript будуються за рахунок ранньої реалізації LiveScript / JavaScript). Поточний стандарт ECMAScript становить 5.1 (2011); на той момент, коли питання було задано спочатку (червень 09), стандарт був 3 (4 було відмовлено), але 5 було випущено незабаром після публікації в кінці 2009 року. Це повинно окреслити одну проблему; те, за яким стандартом може слідувати реалізація javascript, може не відображати те, що насправді існує, оскільки а) це реалізація заданого стандарту; б) не всі реалізації стандарту є пуританськими,

По суті, маючи справу з javascript, ви маєте справу з похідною (JavaScript, специфічною для браузера) реалізації (сам JavaScript). Наприклад, V8 Google реалізує ECMAScript 5.0, але JScript Internet Explorer не намагається відповідати жодному стандарту ECMAScript, але Internet Explorer 9 відповідає стандарту ECMAScript 5.0.

Коли один аргумент передається новій даті (), він передає цей прототип функції:

new Date(value)

Коли два чи більше аргументів передаються до нової дати (), він передає цей прототип функції:

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


Обидві ці функції повинні виглядати знайомими, але це не одразу дає відповідь на ваше запитання, а те, що кількісно визначається як прийнятний «формат дати», потребує подальшого пояснення. Коли ви передаєте рядок до нової дати (), він зателефонує до прототипу (зауважте, що я дуже просто використовую слово прототип ; версії можуть бути окремими функціями, або це може бути частиною умовного твердження в одній функції) для нова дата (значення) з рядком як аргумент для параметра "значення". Ця функція спочатку перевірить, чи це число чи рядок. Документацію для цієї функції можна знайти тут:

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 дозволяє реалізувати конкретні формати. Однак це все ще не відповідає на питання, яка документація доступна у наявних форматах, а також які формати фактично дозволені. Ми розглянемо реалізацію JavaScript у V8; Зверніть увагу, я не припускаю, що це "найкращий" механізм javascript (як можна визначити "найкращий" або навіть "хороший"), і не можна вважати, що формати, дозволені у V8, представляють усі наявні сьогодні формати, але я думаю, що це справедливо припустити, що вони відповідають сучасним очікуванням.

V8 від Google, date.js, DateConstructor

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141

Переглядаючи функцію DateConstructor, ми можемо зробити висновок, що нам потрібно знайти функцію DateParse; однак зауважте, що "рік" не є фактичним роком і є лише посиланням на параметр "рік".

V8 Google, date.js, DateParse

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270

Це викликає% DateParseString, що є фактично посиланням функції на час виконання функції C ++. Він посилається на такий код:

V8 від Google, runtime.cc,% DateParseString

https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559

Виклик функції, про який ми маємо справу в цій функції, призначений для DateParser :: Parse (); ігноруйте логіку навколо цих викликів функцій, це лише перевірки на відповідність типу кодування (ASCII та UC16). DateParser :: Аналіз визначається тут:

V8 Google, dateparser-inl.h, DateParser :: Синтаксичний аналіз

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. Декларуючи годину і хвилину, ви можете використовувати "hh: mm" або "hhmm".
  7. Слова, що позначають часовий пояс, інтерпретуються як часовий пояс.
  8. Всі інші номери інтерпретуються як "компоненти дати".
  9. Усі слова, які починаються з перших трьох цифр місяця, трактуються як місяць.
  10. Ви можете визначити хвилини та години разом у будь-якому з двох форматів: "hh: mm" або "hhmm".
  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 додатково згадує додатковий стандарт для об’єкта 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


92

Переконайтеся, що ви перевіряєте Datejs під час роботи з датами в JavaScript. Це досить вражаюче і добре зафіксовано, як ви можете бачити у випадку функції toString .

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


2
Я не міг знайти спосіб подати datejs мілісекундами, щоб створити дату. Так: var dateTime = нова дата (); dateTime.setTime (мілісекунд);
Арне Евертссон

14
25 к? Просто на побачення? Ой.
Бен Леш

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 Але я все ще люблю momentjs більше: D
gongzhitaao

У вас є проблеми при місяці зйомки: новий Дата ((нова дата ()). Формат ('рр-р-MM-dd')) повернення травень, але зараз це червень: - / хто використовувати часовий пояс у рядку розбору?
e-info128

1
@WHK Це насправді дуже примітивний аналізатор дати. Про всяк випадок, якщо вам не доведеться занадто багато возитися з побаченнями. Якщо вам справді потрібно впоратися з різними форматами дат, я б рекомендував окрему бібліотеку, наприклад, momentjs. : D
gongzhitaao

1
@WHK For console.log(new Date('2014-06-01')) -> May я думаю, це має щось з часовим поясом: D
gongzhitaao

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 (нова дата (), "DD / MM / YY"));
хакан

1
Це надрукує текст "Дата: 12/11 / РР", оскільки вищевказані не обробляють двозначні дати. Якщо вам потрібно це, ви могли б додати відразу після до повернення заяви: format = format.replace("YY", (""+date.getFullYear()).substring(2));. Хоча це стає некрасивим - ви, мабуть, хочете спуститись по маршруту RegEx або подібному.
Оллі Беннетт

1
@mrzmyr Ви дійсно думаєте, що дати форматування будуть вузьким місцем? Давай.
doug65536

11

Ось функція, яку я багато використовую. Результат - 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 частини дорівнює 0, це не те саме, у вашій функції результат "00", але не "000".
Ерік Ван

9

Вам може бути корисна ця модифікація об’єкта дати, яка менша за будь-яку бібліотеку і легко розширюється для підтримки різних форматів:

ПРИМІТКА:

  • Він використовує Object.keys (), який не визначений у старих браузерах, тому вам може знадобитися реалізація polyfill із заданого посилання.

КОД

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'); // Повернення 16.08.2013.
Адріан Мюр

this.getMonth (); виходить з ладу в iOS
N20084753

7

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

http://blarg.co.uk/blog/javascript-date-formats

Мої результати дійшли висновку, що наступні формати дійсні у всіх браузерах, які я тестував (у прикладах використовується дата "9 серпня 2013 року"):

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

  • 09.08.2013
  • 2013/08/9
  • 2013/8/09
  • 2013/8/9
  • 2013 / серпень / 09
  • 2013 / серпень / 9
  • 2013 / серпень / 09
  • 2013 / серпень / 9

[Місяць] / [Повний рік] / [Номер дати] - Місяць може бути числом із початковим нулем або без нього, або ім'ям місяця у короткому чи довгому форматі, а номер дати може бути із нульовим нулем або без нього.

  • 03.09.2013
  • 03.08.2013
  • 8/2013/09
  • 8/2013/9
  • Серпень / 2013/09
  • Серпень / 2013/9
  • Сер / 2013/09
  • Серпень / 2013/9

Будь-яка комбінація [Повний рік], [Ім'я місяця] та [Номер дати], розділені пробілами - Назва місяця може бути у короткому або довгому форматі, а номер дати може бути з нульовим нулем або без нього.

  • 2013. 09 серпня
  • Серпень 2013 09
  • 09 серпня 2013 року
  • 2013. 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

Форматування та особливо розбір дат у 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. І це дуже добре зафіксовано .

Цукор приносить класу Date дуже любов, починаючи з методу Date.create, який може зрозуміти дати в будь-якому форматі на 15 основних мовах, включаючи відносні формати типу "1 годину тому". Дати можна також виводити в будь-якому форматі чи мові, використовуючи простий для розуміння синтаксис, із ярликами до часто використовуваних форматів дати. Складне порівняння дати також можливе з такими методами, як є, які розуміють будь-який формат і застосовують побудовані в точності.

Кілька прикладів:

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 Library

Не впевнений, чи допоможе це, але я вважаю це корисним у кількох проектах - схоже, це зробить все, що вам потрібно.

Підтримує форматування дати / часу, математику дати (додавання / віднімання частин дати), порівняння дат, аналіз дати тощо.

Немає причини вважати це, якщо ви вже використовуєте рамку (вони всі здатні), але якщо вам просто потрібно швидко додати маніпуляцію датою до проекту, дайте йому шанс.


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 , ви можете використовувати мій порт strroll . Він легкий (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/strearch


0

Правильний спосіб відформатувати дату для повернення "2012-12-29" - це сценарій із формату дати JavaScript :

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

Цей код НЕ працює:

var d1 = new Date();
d1.toString('yyyy-MM-dd');      

3
вам потрібен сценарій, пов’язаний "Формат дати JavaScript", зв'язаний вище
Себастьян Вірек

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.