Як відформатувати дату JavaScript


2220

Як у форматі JavaScript я можу відформатувати об'єкт дати для друку 10-Aug-2010?


204
Як завжди: будьте обережні, що МІСЯЦЬ НЕОБХІДНО! Тож січень нульовий не один ...
Крістоф Руссі

12
Також будьте обережні, myDate.getDay()не повертається день тижня, але розташування буднього дня, пов'язане з тижнім. myDate.getDate()повертає поточний будній день .
Jimenemex

3
Для форматування DateTimes у JavaScript використовуйте Intl.DateTimeFormatоб'єкт. Я описую це у своєму пості: Пост . Я створюю онлайн-рішення для вашої відповіді за допомогою Intl.DateTimeFormat Check Online
Iman Bahrampour

5
Ви можете використовуватиtoLocaleDateString
onmyway133

12
У javascript знадобилося стільки часу, щоб отримати URL-адресу як стандартизований об’єкт, де ви можете вирвати ключ парам-запиту, захопити протокол, захопити домен верхнього рівня тощо. Вони можуть зробити ES6 ES7, але все ще не можуть просто встановити стандартну дату формат часу / аналізатор часу в 2019 році? Це так, ніби вони думають "так, так ... хто на землі, використовуючи javascript, потребує регулярної роботи з часом і датами ...."
ahnbizcad

Відповіді:


1285

Для форматів дат із обмеженим користувачем вам потрібно витягнути компоненти (або час) дати з DateTimeFormatоб’єкта (який є частиною API інтернаціоналізації ECMAScript ), а потім вручну створити рядок з потрібними роздільниками.

Для цього можна скористатися DateTimeFormat#formatToParts:

const date = new Date('2010-08-05')
const dateTimeFormat = new Intl.DateTimeFormat('en', { year: 'numeric', month: 'short', day: '2-digit' }) 
const [{ value: month },,{ value: day },,{ value: year }] = dateTimeFormat .formatToParts(date ) 

console.log(`${day}-${month}-${year }`)
console.log(`${day}👠${month}👢${year}`) // just for fun

Ви також можете витягнути частини окремо DateTimeFormatза допомогою DateTimeFormat#format, але зауважте, що при використанні цього методу, починаючи з березня 2020 року, є помилка в реалізації ECMAScript, коли справа стосується провідних нулів на хвилини та секунди (ця помилка обійдений вище підходом).

const d = new Date('2010-08-05')
const ye = new Intl.DateTimeFormat('en', { year: 'numeric' }).format(d)
const mo = new Intl.DateTimeFormat('en', { month: 'short' }).format(d)
const da = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(d)

console.log(`${da}-${mo}-${ye}`)

Працюючи з датами та часом, зазвичай варто використовувати бібліотеку (наприклад, moment.js , luxon ) через безліч прихованих складностей поля.

Зауважимо, що інтернаціоналізаційний API ECMAScript, що використовується у вищезазначених рішеннях, не підтримується в IE10 ( 0,03% світового ринку на веб-переглядачі у лютому 2020 року).


368
Дійсно, замість цього використовувати бібліотеку типу Moment.js або Date.js. Ця проблема протягом багатьох разів була вирішена.
Бенджамін Оукс

239
Чому вони не включають функцію в Dateоб'єкт для цього?
Наян

68
Важливим моментом є те, що метод getMonth () повертає індекс, що базується на 0, тому, наприклад, січень повернеться, 0 лютого повернеться 1, і т.д. ...
Марко

627
moment.js 2.9.0 - це 11,6k gzipped, цей приклад - 211 байт gzipped.
mrzmyr

26
Слід зазначити, що ви ніколи і ніколи не повинні використовувати document.write (). Величезні проблеми безпеки та продуктивності.
Метт Дженсен

2003

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

Основні приклади параметрів:

  1. день:
    представлення дня.
    Можливі значення "числові", "двозначні".
  2. буддень:
    представлення будня.
    Можливі значення "вузький", "короткий", "довгий".
  3. рік:
    Представлення року.
    Можливі значення "числові", "двозначні".
  4. місяць:
    Представлення місяця.
    Можливі значення "числові", "двозначні", "вузькі", "короткі", "довгі".
  5. година:
    Представлення години.
    Можливі значення "числові", "двозначні".
  6. хвилина: Подання хвилини.
    Можливі значення "числові", "двозначні".
  7. другий:
    Представлення другого.
    Можливі значення "числові", двозначні ".

Усі ці клавіші необов’язкові. Ви можете змінити кількість значень параметрів, виходячи зі своїх вимог, і це також відобразить наявність кожного терміну часу дати.

Примітка. Якщо ви хочете налаштувати лише параметри вмісту, але все-таки використовувати поточну локаль, передача nullпершого параметра спричинить помилку. Використовуйте undefinedзамість цього.

Для різних мов:

  1. "en-US": Для англ
  2. "привіт": для хінді
  3. "ja-JP": для японців

Можна використовувати більше мовних варіантів.

Наприклад

var options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
var today  = new Date();

console.log(today.toLocaleDateString("en-US")); // 9/17/2016
console.log(today.toLocaleDateString("en-US", options)); // Saturday, September 17, 2016
console.log(today.toLocaleDateString("hi-IN", options)); // शनिवार, 17 सितंबर 2016

Ви також можете використовувати toLocaleString()метод з тією ж метою. Єдина відмінність полягає в тому, що ця функція забезпечує час, коли ви не передаєте жодних параметрів.

// Example
9/17/2016, 1:21:34 PM

Список літератури:


45
Майже збирався використовувати moment.jsдля простого формату. На щастя, здійснили додатковий пошук у Google і виявили, що вже це працює нативний API. Збережено зовнішню залежність. Дивовижно!
LeOn - Хан Лі,

21
Здається, ця відповідь має бути найкращою "поточною" відповіддю. Також використовується опція "hour12: true", щоб використовувати 12-годинний та 24-годинний формат. Можливо, слід додати до вашого підсумкового списку у відповідь.
Дуг Кнудсен

14
Я не отримую відгуків щодо цієї відповіді. Це не вирішує проблему у питанні. (тобто дайте мені дату, схожу на 10 серпня 2010 року). Використовувати toLocaleDateString () досить складно. Бібліотека date.format здається кращим рішенням (принаймні для користувачів Node)
Iarwa1n

3
Якщо передача undefinedпершого параметра локалі вважається довільною, ви можете замість цього передати значення "default"для використання параметрів
локальної

3
@ Iarwa1n Ця відповідь не згадується, але ви можете використовувати toLocaleDateString, щоб повернути лише певні частини, до яких потім можна приєднатися. Перевірте мою відповідь нижче. date.toLocaleDateString("en-US", { day: 'numeric' }) + "-"+ date.toLocaleDateString("en-US", { month: 'short' }) + "-" + date.toLocaleDateString("en-US", { year: 'numeric' })слід дати16-Nov-2019
K Vij

609

Використовуйте бібліотеку date.format :

var dateFormat = require('dateformat');
var now = new Date();
dateFormat(now, "dddd, mmmm dS, yyyy, h:MM:ss TT");

повертає:

Saturday, June 9th, 2007, 5:46:21 PM 

формат дати в npm

http://jsfiddle.net/phZr7/1/


4
це може здатися більш довгим рішенням, але стиснене та використане на сайті, який використовує дати, справедливим рішенням буде кращим рішенням!
RobertPitt

5
Це рішення також доступне у вигляді пакету npm: npmjs.com/package/dateformat
David

19
З вищевказаним плагіном існує 14 відкритих проблем. Навіть я знайшов одне :(
Аміт Кумар Гупта

6
Я отримуюrequire is not defined
Хулі

16
ОП просила рішення JS
Люк Прінг

523

Якщо вам потрібно швидко відформатувати дату , використовуючи звичайний JavaScript, використання getDate, getMonth + 1, getFullYear, getHoursі getMinutes:

var d = new Date();

var datestring = d.getDate()  + "-" + (d.getMonth()+1) + "-" + d.getFullYear() + " " +
d.getHours() + ":" + d.getMinutes();

// 16-5-2015 9:50

Або, якщо вам потрібно, це буде залите нулями:

var datestring = ("0" + d.getDate()).slice(-2) + "-" + ("0"+(d.getMonth()+1)).slice(-2) + "-" +
    d.getFullYear() + " " + ("0" + d.getHours()).slice(-2) + ":" + ("0" + d.getMinutes()).slice(-2);

// 16-05-2015 09:50

Чи можете ви сказати, як отримати формат на зразок понеділка, 23 березня 2018 року ??
Сачин HR

@SachinHR, див. Попередню відповідь: stackoverflow.com/a/34015511/4161032 . toLocaleDateString()Може відформатувати дату , використовуючи локалізовані імена місяць / день.
sebastian.i

12
Ви також можете .toString().padStart(2, '0')
прокладати

1
@DmitryoN, якщо потрібно, рік можна прокласти так само:("000" + d.getFullYear()).slice(-4)
sebastian.i

4
@BennyJobigan Зазначимо, що String.padStart()він доступний лише з ECMAScript 2017.
JHH

413

Ну, а що я хотів - це перетворити сьогоднішню дату в дружній рядок дати MySQL, як-от 2012-06-23, і використати цей рядок як параметр в одному з моїх запитів. Просте рішення, яке я знайшов:

var today = new Date().toISOString().slice(0, 10);

Майте на увазі, що наведене вище рішення не враховує зміщення вашого часового поясу.

Ви можете замість цього скористатися цією функцією:

function toJSONLocal (date) {
    var local = new Date(date);
    local.setMinutes(date.getMinutes() - date.getTimezoneOffset());
    return local.toJSON().slice(0, 10);
}

Це дасть вам правильну дату у випадку, якщо ви виконуєте цей код близько початку / кінця дня.


9
Ви можете зробити new Date(date + " UTC")фокус на часовому поясі, і ви можете усунути лінію setMinutes. Людина, javascript брудний
Vajk Hermecz

23
Y10K сумісна версія: var today = new Date().toISOString().slice(0,-14):)
Alex Shaffer

22
Або такnew Date().toISOString().split('T')[0]
rofrol

4
new Date().toISOString().slice(0, 16).replace('T',' ')включити час
Геррі ван Вік

3
Лише коментуючи, що відсутність часового поясу не є деякою незручністю "навколо початку / кінця дня". Наприклад, в Австралії дата може бути неправильною приблизно до 11:00 - майже половину дня!
Стів Беннетт

229

Спеціальна функція форматування:

Для фіксованих форматів проста функція робить завдання. Наступний приклад генерує міжнародний формат YYYY-MM-DD:

function dateToYMD(date) {
    var d = date.getDate();
    var m = date.getMonth() + 1; //Month from 0 to 11
    var y = date.getFullYear();
    return '' + y + '-' + (m<=9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d);
}

console.log(dateToYMD(new Date(2017,10,5))); // Nov 5

Формат ОП може формуватися так:

function dateToYMD(date) {
    var strArray=['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    var d = date.getDate();
    var m = strArray[date.getMonth()];
    var y = date.getFullYear();
    return '' + (d <= 9 ? '0' + d : d) + '-' + m + '-' + y;
}
console.log(dateToYMD(new Date(2017,10,5))); // Nov 5

Примітка. Однак, як правило, не годиться розширювати стандартні бібліотеки 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 для дати.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tostring

new Date().toString(); // e.g. "Fri Nov 21 2016 08:00:00 GMT+0100 (W. Europe Standard Time)"

Примітка: з цих форматів можна генерувати власні вихідні дані>

new Date().toISOString().slice(0,10); //return YYYY-MM-DD

Приклади фрагментів:

console.log("1) "+  new Date().toDateString());
console.log("2) "+  new Date().toISOString());
console.log("3) "+  new Date().toJSON());
console.log("4) "+  new Date().toLocaleDateString());
console.log("5) "+  new Date().toLocaleString());
console.log("6) "+  new Date().toLocaleTimeString());
console.log("7) "+  new Date().toString());
console.log("8) "+  new Date().toISOString().slice(0,10));


3
Дякуємо за останнє .. Корисно для встановлення значення дати введення HTML-дати.
daCoda

new Date().toLocaleDateString()дає вам mm/dd/yyyyне dd/mm/yyyyбудь-ласка виправити це.
Арві

1
@RajanVerma: toLocaleDateString надає вашу локальну мову, яка, ймовірно, мм / дд / ггр, оскільки ви перебуваєте в США. Тут мовою для дати є dd / mm / yyyy (саме ця точка "locale"). Я написав "наприклад", тому що це не специфікація, а приклад виводу.
Адріан

177

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

var formatted = $.datepicker.formatDate("M d, yy", new Date("2014-07-08T09:02:21.377"));

// formatted will be 'Jul 8, 2014'

Деякі параметри формату дати для вибору дати доступні тут .


13
Як я вже говорив - якщо jQueryUI вже використовується в проекті - чому б не використати повторно функцію форматування дати datepicker? Гей, хлопці, я не підкреслюю, чому я отримую негативне голосування за свою відповідь? Будь ласка, поясніть.
Дмитро Павлов

7
Це може бути тому, що хтось може включити інтерфейс jQuery лише для функції формату дати, або це може бути тому, що вибірка дат є необов'язковою частиною бібліотеки, але, мабуть, це тому, що ненавидити jQuery модно.
sennett

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

7
@sennett: Ненавиджу jQuery модно? Тож, мабуть, ви ходите зі штанами на півдорозі, - це майже все, що намагалася кодувати без jQuery як для більшості історії JavaScript ...
Майкл Шепер,

5
У будь-якому випадку, це корисна і цілком розумна відповідь - знову ж таки, 70% веб-сайтів використовують jQuery. Це не повинно бути недоступним через релігійні переконання розробників.
Майкл Шепер

133

Я думаю, що ви можете просто використовувати нестандартний метод датиtoLocaleFormat(formatString)

formatString: Рядок формату в тому ж форматі, який очікує strftime()функція в C.

var today = new Date();
today.toLocaleFormat('%d-%b-%Y'); // 30-Dec-2011

Список літератури:


160
toLocaleFormat (), здається, працює лише у Firefox. І IE, і Chrome для мене не вдається.
fitzgeraldsteele

16
У Chrome є метод .toLocaleString ('en'). Як видається, новий браузер підтримує цей developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
apocalypz

8
Читайте попередження тут: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Carson Reinke

6
це було б найкращим рішенням, якби кожен міг його реалізувати. чорт забираєш ти / chrome
santa

6
@santa: Дійсно. Можливо, була поважна причина не брати до уваги Mozilla з цього приводу, але той факт, що навіть ES6 не має стандартної функції для цього, показує, що це все-таки хакерська мова, а не мова розробника.
Майкл Шепер

105

Звичайний JavaScript - найкращий вибір для маленьких онімерів.

З іншого боку, якщо вам потрібно більше матеріалів про побачення, MomentJS - це чудове рішення.

Наприклад:

moment().format('YYYY-MM-DD HH:m:s');     // now() -> 2015-03-24 14:32:20
moment("20111031", "YYYYMMDD").fromNow(); // 3 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow();        // 11 hours ago
moment().endOf('day').fromNow();          // in 13 hours

2
важливо зазначити: не використовуйте, YYYYякщо ви не знаєте різниці між YYYYі yyyy: stackoverflow.com/questions/15133549/…
Домін

@Domin, що характерно для NSDateFormatter в iOS, як використовується, наприклад, від Objective-C або Swift. Це питання стосується Javascript у браузері, і у цій відповіді використовується MomentJS, у якому YYYY(не yyyy) є стандартним роком та GGGG(не YYYY) - тижні року ISO.
Марк Рід

2
Момент на 100% не застарілий @Gerry
Ліам

97

У сучасних браузерах (*) ви можете просто так:

var today = new Date().toLocaleDateString('en-GB', {
    day : 'numeric',
    month : 'short',
    year : 'numeric'
}).split(' ').join('-');

Висновок, якщо виконано сьогодні (24 січня 2016 р.):

'24-Jan-2016'

(*) За даними MDN , "сучасні браузери" означають Chrome 24+, Firefox 29+, Internet Explorer 11, Edge 12+, Opera 15+ та Safari щомісяця .


Чи є спосіб перевірити, чи підтримується ця функція, а якщо ні, то за замовчуванням для більш простого рішення?
James Wierzba

@JamesWierzba: Ви можете використовувати цю поліфункцію !
Джон Slegers

Це навіть не вказано на сайті caniuse.com: /
Чарльз Вуд

51

Ви повинні поглянути на date.js . Він додає багато зручних помічників для роботи з датами, наприклад, у вашому випадку:

var date = Date.parse('2010-08-10');
console.log(date.toString('dd-MMM-yyyy'));

Початок роботи: http://www.datejs.com/2007/11/27/getting-started-with-datejs/


Дякую. Це дуже всебічна і повна бібліотека, з невеликим слідом.
mitcheljh

Я думаю, що в даний час я отримую номер від Date.parse, тоді як дата date = нова дата (fromString) має більше функцій. На жаль, на мій подив, дляString також здається, що він просто відображає за замовчуванням, не інтерпретуючи переданий аргумент для його форматування. Використання NodeJS 11+ toDateString - це коротший вихід, але не потребує форматування. Все, що я бачу, це дуже перекручений toLocaleDateString
Майстер Джеймс

38

Я можу отримати ваш запитуваний формат в одному рядку, використовуючи не бібліотеки, ані методи Date, просто regex:

var d = (new Date()).toString().replace(/\S+\s(\S+)\s(\d+)\s(\d+)\s.*/,'$2-$1-$3');
// date will be formatted as "14-Oct-2015" (pass any date object in place of 'new Date()')

У моєму тестуванні це надійно працює в основних браузерах (Chrome, Safari, Firefox та IE.) Як зазначав @RobG, вихід Date.prototype.toString () залежить від впровадження, тому просто перевіряйте вихід, щоб бути впевненим він працює прямо у вашому JavaScript-механізмі. Ви навіть можете додати код, щоб перевірити вихідний рядок і переконатися, що він відповідає тому, що ви очікуєте, перш ніж замінити регулярний вираз.


console.log(new Date().toString().replace(/\S+\s(\S+)\s(\d+)\s(\d+)\s.*/,'$2-$1-$3'));
Джон

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

як щодо часової частини (HH: mm: ss)?
unruledboy

@unruledboy var d = (нова дата ()). toString () .замінити (/ \ S + \ s (\ S +) \ s (\ d +) \ s (\ d +) \ s (\ S +) \ s. * / , '$ 2- $ 1- $ 3 $ 4'); - або щоб отримати просто часову частину без самої дати, використовуйте: var d = (нова дата ()). toString (). замінити (/ \ S + \ s (\ S +) \ s (\ d +) \ s (\ d +) \ s (\ S +) \ s. * /, '$ 4');
JD Smith

37

@ Sébastien - альтернатива всієї підтримки браузера

new Date(parseInt(496407600)*1000).toLocaleDateString('de-DE', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).replace(/\./g, '/');

Документація: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString


5
Замість того, щоб робити .replace (), ви можете просто використовувати "en-GB" як локаль. :)
Roberto14

1
Це дуже добре, наприклад, new Date().toLocaleDateString("en-EN", {month: "short", weekday: "short", day: "2-digit", year: "numeric"})повертається"Wed, Sep 06, 2017"
Пітер Т.

37

Гаразд , у нас є щось під назвою Intl, що дуже корисно для форматування дати в JavaScript сьогодні:

Ваша дата, як показано нижче:

var date = '10/8/2010';

І ви переходите на Date, використовуючи новий Date (), як показано нижче:

date = new Date(date);

Тепер ви можете відформатувати його будь-яким способом, скориставшись наведеним нижче списком локалів :

date = new Intl.DateTimeFormat('en-AU').format(date); // Australian date format: "8/10/2010" 


date = new Intl.DateTimeFormat('en-US').format(date); // USA date format: "10/8/2010" 


date = new Intl.DateTimeFormat('ar-EG').format(date);  // Arabic date format: "٨‏/١٠‏/٢٠١٠"

Якщо ви точно хочете вказаного вище формату, ви можете:

date = new Date(Date.UTC(2010, 7, 10, 0, 0, 0));
var options = {year: "numeric", month: "short", day: "numeric"};
date = new Intl.DateTimeFormat("en-AU", options).format(date).replace(/\s/g, '-');

І результат буде таким:

"10-Aug-2010"

Докладніші відомості про документацію API API та Intl.DateTimeFormat див .


Не підтримується IE
Штани

Це лише IE11, IE10 - вийшли з життя до того, як це існувало, тому це зрозуміло. 92% від caniuse, який досить добре caniuse.com/#search=datetimeformat
Tofandel

32

Використання рядка шаблону рядків ECMAScript Edition 6 (ES6 / ES2015):

let d = new Date();
let formatted = `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`;

Якщо вам потрібно змінити роздільники:

const delimiter = '/';
let formatted = [d.getFullYear(), d.getMonth() + 1, d.getDate()].join(delimiter);

30

Упакований розчин: Луксон

Якщо ви хочете використовувати одне рішення, щоб підходити всім, я настійно рекомендую використовувати Luxon (модернізовану версію Moment.js ), яка також робить форматування у багатьох мовах / мовах та багатьох інших функціях.

Luxon розміщується на веб-сайті Moment.js і розробляється розробником Moment.js, оскільки Moment.js має обмеження, з якими розробник хотів вирішити, але не зміг.

Щоб встановити:

npm install luxonабо yarn add luxon(перейдіть за посиланням для інших способів установки)

Приклад:

luxon.DateTime.fromISO('2010-08-10').toFormat('yyyy-LLL-dd');

Врожайність:

10 серпня-2010

Ручне рішення

Використовуючи подібне форматування, як Moment.js, Class DateTimeFormatter (Java) та Class SimpleDateFormat (Java) , я реалізував комплексне рішення, formatDate(date, patternStr)де код легко читати та змінювати. Ви можете відображати дату, час, AM / PM та ін. Див. Код для отримання додаткових прикладів.

Приклад:

formatDate(new Date(), 'EEEE, MMMM d, yyyy HH:mm:ss:S')

( formatDateреалізовано в фрагменті коду нижче)

Врожайність:

П’ятниця, 12 жовтня 2018 р. 18: 11: 23: 445

Спробуйте код, натиснувши "Запустити фрагмент коду".

Дати та часові схеми

yy= 2-значний рік; yyyy= повний рік

M= цифра місяця; MM= Двозначний місяць; MMM= коротка назва місяця; MMMM= повна назва місяця

EEEE= повна назва робочого дня; EEE= коротка назва буднього дня

d= цифра дня; dd= 2-значний день

h= години ранку / вечора; hh= Двозначна година ранку / вечора; H= годин; HH= 2-значні години

m= хвилини; mm= 2-значні хвилини; aaa= AM / PM

s= секунди; ss= 2-значні секунди

S = мілісекунд

var monthNames = [
  "January", "February", "March", "April", "May", "June", "July",
  "August", "September", "October", "November", "December"
];
var dayOfWeekNames = [
  "Sunday", "Monday", "Tuesday",
  "Wednesday", "Thursday", "Friday", "Saturday"
];
function formatDate(date, patternStr){
    if (!patternStr) {
        patternStr = 'M/d/yyyy';
    }
    var day = date.getDate(),
        month = date.getMonth(),
        year = date.getFullYear(),
        hour = date.getHours(),
        minute = date.getMinutes(),
        second = date.getSeconds(),
        miliseconds = date.getMilliseconds(),
        h = hour % 12,
        hh = twoDigitPad(h),
        HH = twoDigitPad(hour),
        mm = twoDigitPad(minute),
        ss = twoDigitPad(second),
        aaa = hour < 12 ? 'AM' : 'PM',
        EEEE = dayOfWeekNames[date.getDay()],
        EEE = EEEE.substr(0, 3),
        dd = twoDigitPad(day),
        M = month + 1,
        MM = twoDigitPad(M),
        MMMM = monthNames[month],
        MMM = MMMM.substr(0, 3),
        yyyy = year + "",
        yy = yyyy.substr(2, 2)
    ;
    // checks to see if month name will be used
    patternStr = patternStr
      .replace('hh', hh).replace('h', h)
      .replace('HH', HH).replace('H', hour)
      .replace('mm', mm).replace('m', minute)
      .replace('ss', ss).replace('s', second)
      .replace('S', miliseconds)
      .replace('dd', dd).replace('d', day)
      
      .replace('EEEE', EEEE).replace('EEE', EEE)
      .replace('yyyy', yyyy)
      .replace('yy', yy)
      .replace('aaa', aaa);
    if (patternStr.indexOf('MMM') > -1) {
        patternStr = patternStr
          .replace('MMMM', MMMM)
          .replace('MMM', MMM);
    }
    else {
        patternStr = patternStr
          .replace('MM', MM)
          .replace('M', M);
    }
    return patternStr;
}
function twoDigitPad(num) {
    return num < 10 ? "0" + num : num;
}
console.log(formatDate(new Date()));
console.log(formatDate(new Date(), 'dd-MMM-yyyy')); //OP's request
console.log(formatDate(new Date(), 'EEEE, MMMM d, yyyy HH:mm:ss.S aaa'));
console.log(formatDate(new Date(), 'EEE, MMM d, yyyy HH:mm'));
console.log(formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss.S'));
console.log(formatDate(new Date(), 'M/dd/yyyy h:mmaaa'));

Дякую @Gerry за виховання Луксона.


1
До речі, клопіткий SimpleDateFormatклас був витіснений роками тому java.time.format.DateTimeFormatterкласом.
Василь Бурк

1
@BasilBourque, зауважив. Вони обидва використовують однакові візерунки. Я працював над проектом до Java8 5 років, тому ніколи не потрапляв на нові речі. Дякую!
lewdev

Дивіться проект ThreeTen-Backport для Java 6 і 7, щоб отримати більшість функцій java.time з майже однаковим API.
Василь Бурк

@BasilBourque дякую за довідку, але я вже не працюю над цим проектом, але я обов'язково буду мати це на увазі, коли він з'явиться.
lewdev

2
момент застарілий, використовуйте luxon
Джеррі

19

Ось який-небудь код, який я тільки написав для обробки форматування дати для проекту, над яким я працюю. Це імітує функцію форматування дати PHP відповідно до моїх потреб. Сміливо використовуйте його, це просто розширення вже існуючого об'єкта Date (). Це може бути не найелегантнішим рішенням, але воно працює для моїх потреб.

var d = new Date(); 
d_string = d.format("m/d/Y h:i:s");

/**************************************
 * Date class extension
 * 
 */
    // Provide month names
    Date.prototype.getMonthName = function(){
        var month_names = [
                            'January',
                            'February',
                            'March',
                            'April',
                            'May',
                            'June',
                            'July',
                            'August',
                            'September',
                            'October',
                            'November',
                            'December'
                        ];

        return month_names[this.getMonth()];
    }

    // Provide month abbreviation
    Date.prototype.getMonthAbbr = function(){
        var month_abbrs = [
                            'Jan',
                            'Feb',
                            'Mar',
                            'Apr',
                            'May',
                            'Jun',
                            'Jul',
                            'Aug',
                            'Sep',
                            'Oct',
                            'Nov',
                            'Dec'
                        ];

        return month_abbrs[this.getMonth()];
    }

    // Provide full day of week name
    Date.prototype.getDayFull = function(){
        var days_full = [
                            'Sunday',
                            'Monday',
                            'Tuesday',
                            'Wednesday',
                            'Thursday',
                            'Friday',
                            'Saturday'
                        ];
        return days_full[this.getDay()];
    };

    // Provide full day of week name
    Date.prototype.getDayAbbr = function(){
        var days_abbr = [
                            'Sun',
                            'Mon',
                            'Tue',
                            'Wed',
                            'Thur',
                            'Fri',
                            'Sat'
                        ];
        return days_abbr[this.getDay()];
    };

    // Provide the day of year 1-365
    Date.prototype.getDayOfYear = function() {
        var onejan = new Date(this.getFullYear(),0,1);
        return Math.ceil((this - onejan) / 86400000);
    };

    // Provide the day suffix (st,nd,rd,th)
    Date.prototype.getDaySuffix = function() {
        var d = this.getDate();
        var sfx = ["th","st","nd","rd"];
        var val = d%100;

        return (sfx[(val-20)%10] || sfx[val] || sfx[0]);
    };

    // Provide Week of Year
    Date.prototype.getWeekOfYear = function() {
        var onejan = new Date(this.getFullYear(),0,1);
        return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()+1)/7);
    } 

    // Provide if it is a leap year or not
    Date.prototype.isLeapYear = function(){
        var yr = this.getFullYear();

        if ((parseInt(yr)%4) == 0){
            if (parseInt(yr)%100 == 0){
                if (parseInt(yr)%400 != 0){
                    return false;
                }
                if (parseInt(yr)%400 == 0){
                    return true;
                }
            }
            if (parseInt(yr)%100 != 0){
                return true;
            }
        }
        if ((parseInt(yr)%4) != 0){
            return false;
        } 
    };

    // Provide Number of Days in a given month
    Date.prototype.getMonthDayCount = function() {
        var month_day_counts = [
                                    31,
                                    this.isLeapYear() ? 29 : 28,
                                    31,
                                    30,
                                    31,
                                    30,
                                    31,
                                    31,
                                    30,
                                    31,
                                    30,
                                    31
                                ];

        return month_day_counts[this.getMonth()];
    } 

    // format provided date into this.format format
    Date.prototype.format = function(dateFormat){
        // break apart format string into array of characters
        dateFormat = dateFormat.split("");

        var date = this.getDate(),
            month = this.getMonth(),
            hours = this.getHours(),
            minutes = this.getMinutes(),
            seconds = this.getSeconds();
        // get all date properties ( based on PHP date object functionality )
        var date_props = {
            d: date < 10 ? '0'+date : date,
            D: this.getDayAbbr(),
            j: this.getDate(),
            l: this.getDayFull(),
            S: this.getDaySuffix(),
            w: this.getDay(),
            z: this.getDayOfYear(),
            W: this.getWeekOfYear(),
            F: this.getMonthName(),
            m: month < 10 ? '0'+(month+1) : month+1,
            M: this.getMonthAbbr(),
            n: month+1,
            t: this.getMonthDayCount(),
            L: this.isLeapYear() ? '1' : '0',
            Y: this.getFullYear(),
            y: this.getFullYear()+''.substring(2,4),
            a: hours > 12 ? 'pm' : 'am',
            A: hours > 12 ? 'PM' : 'AM',
            g: hours % 12 > 0 ? hours % 12 : 12,
            G: hours > 0 ? hours : "12",
            h: hours % 12 > 0 ? hours % 12 : 12,
            H: hours,
            i: minutes < 10 ? '0' + minutes : minutes,
            s: seconds < 10 ? '0' + seconds : seconds           
        };

        // loop through format array of characters and add matching data else add the format character (:,/, etc.)
        var date_string = "";
        for(var i=0;i<dateFormat.length;i++){
            var f = dateFormat[i];
            if(f.match(/[a-zA-Z]/g)){
                date_string += date_props[f] ? date_props[f] : '';
            } else {
                date_string += f;
            }
        }

        return date_string;
    };
/*
 *
 * END - Date class extension
 * 
 ************************************/

18

Рішення JavaScript без використання зовнішніх бібліотек:

var now = new Date()
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
var formattedDate = now.getDate() + "-" + months[now.getMonth()] + "-" + now.getFullYear()
alert(formattedDate)

16

new Date().toLocaleDateString()

// "3/21/2018"

Більше документації на developer.mozilla.org


1
Слід зазначити, що ви ніколи і ніколи не повинні використовувати document.write (). Величезні проблеми безпеки та ефективності
Євген Фіделін,

15

Якщо ви використовуєте інтерфейс jQuery у своєму коді, є вбудована функція, яка називається formatDate(). Я використовую це таким чином, щоб відформатувати сьогоднішню дату:

var testdate = Date();
testdate = $.datepicker.formatDate( "d-M-yy",new Date(testdate));
alert(testdate);

Ви можете побачити багато інших прикладів форматування дати в документації на інтерфейс jQuery .


15

У нас є маса рішень для цього, але я думаю, що найкраще з них - це Moment.js. Тому я особисто пропоную використовувати Moment.js для операцій з датою та часом.

console.log(moment().format('DD-MMM-YYYY'));
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>


чому ви включаєте jquery?
Ced

1
Ох вибачте його не вимагати. Дякуємо @Ced
Віджай Махерія

як вказати дату, яку я маю на момент.js? Я думаю, що це завжди потребує поточного часу.
Дейв Ранджан

1
@DaveRanjan Я думаю, вам потрібно перетворити власну дату. Тому використовуйте цей: console.log (момент ('2016-08-10'). Формат ('DD-MMM-YYYY'));
Vijay Maheriya

Так, зрозумів це пізніше. Дякую :)
Дейв Ранджан

15

Корисним та гнучким способом форматування DateTimes у JavaScript є Intl.DateTimeFormat:

var date = new Date();
var options = { year: 'numeric', month: 'short', day: '2-digit'};
var _resultDate = new Intl.DateTimeFormat('en-GB', options).format(date);
// The _resultDate is: "12 Oct 2017"
// Replace all spaces with - and then log it.
console.log(_resultDate.replace(/ /g,'-'));

Результат: "12-Oct-2017"

Формати дати та часу можна налаштувати за допомогою аргументу параметрів.

The Intl.DateTimeFormatОб'єкт є конструктором для об'єктів , які дозволяють мову чутливої дату і час форматування.

Синтаксис

new Intl.DateTimeFormat([locales[, options]])
Intl.DateTimeFormat.call(this[, locales[, options]])

Параметри

локалі

За бажанням. Рядок із тегом мови BCP 47 або масив таких рядків. Для загальної форми та інтерпретації аргументу локалів див. Сторінку Intl. Дозволені наступні ключі розширення Unicode:

nu
Numbering system. Possible values include: "arab", "arabext", "bali", "beng", "deva", "fullwide", "gujr", "guru", "hanidec", "khmr", "knda", "laoo", "latn", "limb", "mlym", "mong", "mymr", "orya", "tamldec", "telu", "thai", "tibt".
ca
Calendar. Possible values include: "buddhist", "chinese", "coptic", "ethioaa", "ethiopic", "gregory", "hebrew", "indian", "islamic", "islamicc", "iso8601", "japanese", "persian", "roc".

Параметри

За бажанням. Об'єкт з деякими або всіма наведеними нижче властивостями:

localeMatcher

Алгоритм відповідності локалів, який потрібно використовувати. Можливі значення є "lookup"і "best fit"; за замовчуванням - "best fit". Інформацію про цю опцію див. На сторінці Intl.

часовий пояс

Часовий пояс для використання. Єдине реалізація значення, яке слід розпізнати, це "UTC"; за замовчуванням - часовий пояс за замовчуванням для виконання. Реалізації можуть також розпізнавати імена часових поясів бази даних часу IANA зони, такі як "Asia/Shanghai", "Asia/Kolkata", "America/New_York".

година12

Чи використовувати 12-годинний час (на відміну від 24-годинного). Можливі значення є trueі false; за замовчуванням залежить локаль.

formatMatcher

Алгоритм відповідності формату для використання. Можливі значення є "basic"і "best fit"; за замовчуванням - "best fit". Дивіться наступні параграфи для інформації про використання цієї властивості.

Наступні властивості описують компоненти часу та дати, які слід використовувати у форматованому виведенні, та їх потрібні подання. Потрібні впровадження для підтримки щонайменше таких підмножин:

weekday, year, month, day, hour, minute, second
weekday, year, month, day
year, month, day
year, month
month, day
hour, minute, second
hour, minute

Впровадження може підтримувати інші підмножини, і запити будуть узгоджені проти всіх доступних комбінацій представлення підмножини, щоб знайти найкращу відповідність. Для цього узгодження доступні два алгоритми та обрані властивістю formatMatcher: Повністю заданий "basic"алгоритм та алгоритм "найкращого підходу ", що залежить від реалізації.

будній день

Представлення будня. Можливі значення "narrow", "short", "long".

епоха

Представлення епохи. Можливі значення "narrow", "short", "long".

рік

Представлення року. Можливі значення "numeric", "2-digit".

місяць

Представництво місяця. Можливі значення "numeric", "2-digit", "narrow", "short", "long".

день

Представлення дня. Можливі значення "numeric", "2-digit".

година

Представлення години. Можливі значення "numeric", "2-digit".

хвилина

Представлення хвилини. Можливі значення "numeric", "2-digit".

другий

Представлення другого. Можливі значення "numeric", "2-digit".

timeZoneName

Представлення назви часового поясу. Можливі значення "short", "long". Значення за замовчуванням для кожного властивості компонента дата-час невизначене, але якщо всі властивості компонента не визначені, то рік, місяць і день приймаються такими, що є "numeric".

Перевірте в Інтернеті

Детальніше


15

Це може допомогти у вирішенні проблеми:

var d = new Date();

var options = {   
    day: 'numeric',
    month: 'long', 
    year: 'numeric'
};

console.log(d.toLocaleDateString('en-ZA', options));

Дата, щоб знайти формат


2
або d.toLocaleDateString('en-US', options);якщо ви перебуваєте в США.
BishopZ

Це було моє рішення. Дякую.
Стівен Роджерс

13

Ось як я реалізував для своїх плагін npm

var monthNames = [
  "January", "February", "March",
  "April", "May", "June", "July",
  "August", "September", "October",
  "November", "December"
];

var Days = [
  "Sunday", "Monday", "Tuesday", "Wednesday",
  "Thursday", "Friday", "Saturday"
];

var formatDate = function(dt,format){
  format = format.replace('ss', pad(dt.getSeconds(),2));
  format = format.replace('s', dt.getSeconds());
  format = format.replace('dd', pad(dt.getDate(),2));
  format = format.replace('d', dt.getDate());
  format = format.replace('mm', pad(dt.getMinutes(),2));
  format = format.replace('m', dt.getMinutes());
  format = format.replace('MMMM', monthNames[dt.getMonth()]);
  format = format.replace('MMM', monthNames[dt.getMonth()].substring(0,3));
  format = format.replace('MM', pad(dt.getMonth()+1,2));
  format = format.replace(/M(?![ao])/, dt.getMonth()+1);
  format = format.replace('DD', Days[dt.getDay()]);
  format = format.replace(/D(?!e)/, Days[dt.getDay()].substring(0,3));
  format = format.replace('yyyy', dt.getFullYear());
  format = format.replace('YYYY', dt.getFullYear());
  format = format.replace('yy', (dt.getFullYear()+"").substring(2));
  format = format.replace('YY', (dt.getFullYear()+"").substring(2));
  format = format.replace('HH', pad(dt.getHours(),2));
  format = format.replace('H', dt.getHours());
  return format;
}

pad = function(n, width, z) {
  z = z || '0';
  n = n + '';
  return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}

На який пакунок ви посилаєтесь?
lbrahim

У цьому є помилка: спочатку замінюються імена місяця, потім також заміняється назва місяця. Наприклад March, стане 3archз цим кодом.
ntaso

1
Змініть рядок 'M'на format = format.replace("M(?!M)", (dt.getMonth()+1).toString());і поставте його над рядком з'MMMM'
ntaso


8

Sugar.js має відмінні розширення до об'єкта Date, включаючи a метод Date.format .

Приклади з документації:

Date.create().format('{Weekday} {Month} {dd}, {yyyy}');

Date.create().format('{12hr}:{mm}{tt}')

8

Для кожного, хто шукає дійсно просте рішення ES6, щоб скопіювати, вставити та прийняти:

const dateToString = d => `${d.getFullYear()}-${('00' + (d.getMonth() + 1)).slice(-2)}-${('00' + d.getDate()).slice(-2)}` 

// how to use:
const myDate = new Date(Date.parse('04 Dec 1995 00:12:00 GMT'))
console.log(dateToString(myDate)) // 1995-12-04


8

Станом на 2019 рік, схоже, ви можете дістатися доLocaleDateString, щоб повернути лише певні частини, а потім можете приєднатися до них за своїм бажанням:

var date = new Date();

console.log(date.toLocaleDateString("en-US", { day: 'numeric' }) 
            + "-"+ date.toLocaleDateString("en-US", { month: 'short' })
            + "-" + date.toLocaleDateString("en-US", { year: 'numeric' }) );

> 16-Nov-2019

console.log(date.toLocaleDateString("en-US", { month: 'long' }) 
            + " " + date.toLocaleDateString("en-US", { day: 'numeric' }) 
            + ", " + date.toLocaleDateString("en-US", { year: 'numeric' }) );

> November 16, 2019

8

Ви повинні подивитися на DayJs Це рімейк momentJs, але модульна архітектура орієнтована настільки легше.

Швидка 2кБ альтернатива Moment.js з тим же сучасним API

Day.js - це мінімалістична бібліотека JavaScript, яка аналізує, перевіряє, маніпулює та відображає дати та час для сучасних веб-переглядачів із API, що суттєво підтримує Moment.js. Якщо ви використовуєте Moment.js, ви вже знаєте, як користуватися Day.js.

var date = Date.now();
const formatedDate = dayjs(date).format("YYYY-MM-DD")
console.log(formatedDate);
<script src="https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.8.16/dayjs.min.js" crossorigin="anonymous"></script>


7

Щоб отримати "10 серпня-2010", спробуйте:

var date = new Date('2010-08-10 00:00:00');
date = date.toLocaleDateString(undefined, {day:'2-digit'}) + '-' + date.toLocaleDateString(undefined, {month:'short'}) + '-' + date.toLocaleDateString(undefined, {year:'numeric'})

Для підтримки браузера див. ToLocaleDateString .


Мені не потрібно було "-", ось коротша версія з часом, датою та часовим поясом! дата = нова дата (); date.toLocaleDateString (невизначено, {день: 'двозначний', місяць: 'короткий', рік: 'числовий', година: 'числовий', хвилина: 'числовий', timeZoneName: 'короткий'}); :)
varun
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.