Отримати рядок у форматі YYYYMMDD від об’єкта дати JS?


398

Я намагаюся використовувати JS для перетворення date objectрядка у YYYYMMDDформат. Є простіший спосіб , ніж конкатенації Date.getYear(), Date.getMonth()і Date.getDay()?


4
Об’єднати цих трьох - це шлях
Хуан Кортес

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

Відповіді:


621

Змінений фрагмент коду, який я часто використовую:

Date.prototype.yyyymmdd = function() {
  var mm = this.getMonth() + 1; // getMonth() is zero-based
  var dd = this.getDate();

  return [this.getFullYear(),
          (mm>9 ? '' : '0') + mm,
          (dd>9 ? '' : '0') + dd
         ].join('');
};

var date = new Date();
date.yyyymmdd();

16
Ви повинні замінити [1]на .length===2, тому що індексатор рядка не підтримується повністю. Дивіться цю відповідь з причин, чому.
Айдіакапі

6
var mm = (this.getMonth () + 101) .toStrung (). substring (0, 2);
9дан,

7
Для всіх, хто хоче практичний приклад виправлення @Aidiakapi, я створю тут скрипку: jsfiddle.net/pcr8xbt5/1
killercowuk

1
Якщо ви хочете мати роздільник точок:[this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
Kamil Kiełczewski

3
@ 9dan не повинно бутиvar mm = (this.getMonth() + 101).toString().substring(1, 3)
Pnar Sbi Wer

317

Мені не сподобалося додавання до прототипу. Альтернативою може бути:

var rightNow = new Date();
var res = rightNow.toISOString().slice(0,10).replace(/-/g,"");

<!-- Next line is for code snippet output only -->
document.body.innerHTML += res;


51
Якщо вам не знадобиться rightNowзмінна навколо, ви можете обернути її new Dateі повернути все в один рядок:(new Date()).toISOString().slice(0,10).replace(/-/g,"")
BigBlueHat

5
Я хотів YYYYMMDDHHmmSSsss, щоб я зробив це: var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. Досить простий, але повинен бути інкапсульованим.
Джесс

65
Це взагалі не працюватиме, оскільки Date.toISOString () створює дату, відформатовану UTC, і, отже, можна переходити межі дати залежно від часового поясу. Наприклад, в GMT + 1: (нова дата (2013,13, 25)). ToISOString () == '2013-12-24T23: 00: 00.000Z'
weberste

26
Це не вдасться, якщо хтось у 10000 році використає ваш «ностальгічний» код.
Trevi Awater

9
Запропоноване вдосконалення для подолання часових поясів. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Андреас

182

Ви можете використовувати toISOStringфункцію:

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

Це дасть вам формат "yyyy-mm-dd".


24
У деяких випадках це не включатиме правильний день через денне світло часу та інше ...
Мігель,

1
Можливо, моя творчість порушена @ Miguel, але я не можу придумати випадок, коли це могло б статися. Ви б не хотіли подати приклад?
хмарні роботи

35
Якщо ви знаходитесь у часовому поясі +1 та маєте дату [2015-09-01 00:00:00 GMT + 1], метод toISOString () поверне рядок '2015-08-31T23: 00: 00.000Z 'тому, що дату перетворюють на зміщення UTC / 0 перед тим, як позначати строком.
Лука Баулч

Трохи коротше ... var сьогодні = (нова дата ()). ToISOString (). Підрядка (0, 10);
teawithfruit

Помилка з різним GMT
Tobia

132

Moment.js може бути вашим другом

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');

18
Добре це DID додати 40kb (мінімізований, не gZip) до мого app.js, але я пішов за це, дякую :).
Барт

найкраща відповідь поки що!
TrulyXax

9
Я навіть не чекаю, поки мені неминуче потрібен момент, я просто додаю його на початку проекту :)
martinedwards

1
Можна полегшити:var formattedDate = moment().format('YYYYMMDD');
ns16

37

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

$.datepicker.formatDate('yymmdd', new Date());

Зазвичай я не люблю імпортувати занадто багато бібліотек. Але користувальницький інтерфейс jQuery настільки корисний, ви, ймовірно, будете використовувати його десь у вашому проекті.

Перейдіть на сторінку http://api.jqueryui.com/datepicker/ для отримання додаткових прикладів


37

Це єдиний рядок коду, який можна використовувати для створення YYYY-MM-DDрядка сьогоднішньої дати.

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

^ це! FTW! +1 .. хоча потрібно трохи перевірити.
Гоголь

21
Увага: якщо ваша дата була 2016-01-01 00:00:00 GMT +2, вона повернеться 2015-12-31, оскільки toISOString()дасть 2015-12-31T22: 00: 00 GMT +0 (дві години до цього).
Jérôme Gillard

29
new Date('Jun 5 2016').
  toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).
  replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');

// => '2016-06-05'

5
Найкраща душа.
زياد

Чомусь потрібно було додати час (навіть якщо 00:00), щоб перетворення не пропустило дня назад, коли я запускаю формулу тут, східне узбережжя США. Як тільки я це зробив, він почав надійно працювати. Що мені подобається в цьому, це те, що вона може приймати дату введення в декількох форматах, тому мені більше не потрібно про це турбуватися. new Date('Sun Mar 31 2019 00:00:00.000').toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');
nenea

24

На додаток до відповіді oo, я хотів би порекомендувати відокремлювати логічні операції від повернення і замість них поставити їх як тернарі.

Також використовуйте concat()для забезпечення безпечного конкатенації змінних

Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear();
  var mm = this.getMonth() < 9 ? "0" + (this.getMonth() + 1) : (this.getMonth() + 1); // getMonth() is zero-based
  var dd = this.getDate() < 10 ? "0" + this.getDate() : this.getDate();
  return "".concat(yyyy).concat(mm).concat(dd);
};

Date.prototype.yyyymmddhhmm = function() {
  var yyyymmdd = this.yyyymmdd();
  var hh = this.getHours() < 10 ? "0" + this.getHours() : this.getHours();
  var min = this.getMinutes() < 10 ? "0" + this.getMinutes() : this.getMinutes();
  return "".concat(yyyymmdd).concat(hh).concat(min);
};

Date.prototype.yyyymmddhhmmss = function() {
  var yyyymmddhhmm = this.yyyymmddhhmm();
  var ss = this.getSeconds() < 10 ? "0" + this.getSeconds() : this.getSeconds();
  return "".concat(yyyymmddhhmm).concat(ss);
};

var d = new Date();
document.getElementById("a").innerHTML = d.yyyymmdd();
document.getElementById("b").innerHTML = d.yyyymmddhhmm();
document.getElementById("c").innerHTML = d.yyyymmddhhmmss();
<div>
  yyyymmdd: <span id="a"></span>
</div>
<div>
  yyyymmddhhmm: <span id="b"></span>
</div>
<div>
  yyyymmddhhmmss: <span id="c"></span>
</div>


Якщо комусь подобається користуватися цим, я пропоную СУХО тут, повторно використовуйте вже створені функції, а не робити те ж саме заново.
RiZKiT

@ RiZKiT DRY - це принцип, а не зразок, але, звичайно, це можна багато вдосконалити. Якби я де сам це використав, я, мабуть, застосував би інший шаблон і відсунув методи від прототипу. Я в основному писав приклад, щоб показати там, де інші способи вирішення проблеми. Де люди беруть його звідти, - це самостійно
Ерік Герліц

Приємно! Я використовую ("00" + (this.getDate())).slice(-2)для отримання двоцифрових чисел. Немає оператора "якщо" чи "?:" І менше дзвінків до функції .getX (). Якщо не трохи швидше, то принаймні читабельніше.
le hollandais volant

22

Мені не подобається змінювати рідні об'єкти, і я думаю, що множення чіткіше, ніж обробка рядків прийнятим рішенням.

function yyyymmdd(dateIn) {
  var yyyy = dateIn.getFullYear();
  var mm = dateIn.getMonth() + 1; // getMonth() is zero-based
  var dd = dateIn.getDate();
  return String(10000 * yyyy + 100 * mm + dd); // Leading zeros for mm and dd
}

var today = new Date();
console.log(yyyymmdd(today));

Fiddle: http://jsfiddle.net/gbdarren/Ew7Y4/


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

4
Мультиплікатор 10000 є таким, щоб зрушити ліворуч РРРР на 4 місця (цифри місяць і день потребують 2 цифри кожен) і не має нічого спільного з помилкою Y10K. Мені подобається ця відповідь, і вона заслуговує на повагу!
А. Массон

1
Дякую за цю відповідь, я створив тут скрипку jsfiddle.net/amwebexpert/L6j0omb4
А. Массон,

1
Мені розмноження мені зовсім не було потрібне, і я не розумію, чому воно існує. jsfiddle.net/navyjax2/gbqmv0t5 Інакше залиште це, і це чудова відповідь і мені дуже допомогло.
vapcguy

1
@ D-Money Ага, я зрозумів, що ти маєш на увазі - ти робиш конкатенацію іншого типу, додаючи числа разом, щоб уникнути того, щоб вони робили різні математичні операції один на одного - операцію з заборони нормальної, яка б Ви інакше зіпсували їх. Хороша робота! Шахта працює, тому що я використовую роздільники (що я повинен був би зробити, .replace('-', '')щоб відповісти на питання ОП), тоді як ви були вірними оригінальному питанню ОП, і це не вимагало б цього додаткового кроку. Відмінно!
vapcguy

15

Просте рішення JS (ES5) без можливих проблем зі стрибком дати, спричинене друком Date.toISOString () у UTC:

var now = new Date();
var todayUTC = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));
return todayUTC.toISOString().slice(0, 10).replace(/-/g, '');

Це у відповідь на коментар @ weberste щодо відповіді @Pierre Guilbert.


now.getMonth () повертає 0 , в січні, він повинен бути (now.getMonth () + 1)
Jas

2
Неправильно. Функція UTC за датою очікує, що місяць буде становити від 0 до 11 (але інші <0 і> 11 дозволені).
Dormouse

Чому ви замінюєте кілька дефісів на одну? Може toISOStringповернути кілька послідовних дефісів?
Michaël Witrant

Михайло - він замінює кожну знайдену дефіс однією дефісом. Досі не знаю, чому (можливо, рядок заміни - це просто місце для роздільника). 'G' означає всі події. Шаблон, про який ви думаєте, є / [-] + / g
Джерард ONeill

2
Ти мене вразив. Я днями шукав простий спосіб обійти жахливу обробку TimeZone в Javascript, і це робить трюк!
Гійом Ф.

10

// UTC/GMT 0
document.write('UTC/GMT 0: ' + (new Date()).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812013509

// Client local time
document.write('<br/>Local time: ' + (new Date(Date.now()-(new Date()).getTimezoneOffset() * 60000)).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812113509


Це відповідь, яку я використав. Один лайнер, який враховує часовий пояс. Щоб відповісти на запитання оригінального афіші, ми могли б зробити: (нова дата (дата.но () - (нова дата ()). GetTimezoneOffset () * 60000)). ToISOString () .замінити (/ [^ 0-9] / g, "") .slice (0,8)
tomwoods

thx, щоб отримати YYYY-MM-DD я використав: нову дату (Date.now () - (нова дата ()). getTimezoneOffset () * 60000) .toISOString (). slice (0, 10) .replace (/ [ ^ 0-9] / г, "-")
Нік Хамфрі

7

var someDate = new Date();
var dateFormated = someDate.toISOString().substr(0,10);

console.log(dateFormated);


Дуже розумний. Дякую
JMaylin

4
Не працює, оскільки новий Date () має часовий пояс, а Date.toISOString () - UTC. Дивіться мою відповідь.
Dormouse

@Dormouse чи не навпаки? new Date()створює новий об’єкт дати, який є просто обгорткою навколо nr. мс з 1970/01/01 00: 00: 00,000 UTC. Потім toISOStringдрукується в локальному часовому поясі.
Штійн де Вітт

Nope, Date.toISOString () друкується в UTC.
Dormouse

7

Інший спосіб - це використання toLocaleDateStringз локальним словом, який має стандарт формату великих дат , наприклад Швеція, Литва, Угорщина, Південна Корея, ...:

date.toLocaleDateString('se')

Щоб видалити роздільники ( -), це лише питання заміни нецифрових знаків:

console.log( new Date().toLocaleDateString('se').replace(/\D/g, '') );

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


6

Ви можете просто використовувати цей код одного рядка, щоб отримати дату в році

var date = new Date().getFullYear() + "-" + (parseInt(new Date().getMonth()) + 1) + "-" + new Date().getDate();

5

Трохи спрощена версія для найпопулярнішої відповіді в цій темі https://stackoverflow.com/a/3067896/5437379 :

function toYYYYMMDD(d) {
    var yyyy = d.getFullYear().toString();
    var mm = (d.getMonth() + 101).toString().slice(-2);
    var dd = (d.getDate() + 100).toString().slice(-2);
    return yyyy + mm + dd;
}

5

dateformat - це дуже вживаний пакет.

Як користуватись:

Завантажте та встановіть dateformatз NPM. Вимагайте цього у своєму модулі:

const dateFormat = require('dateformat');

а потім просто відформатуйте свої речі:

const myYYYYmmddDate = dateformat(new Date(), 'yyyy-mm-dd');


4

Цей хлопець тут => http://blog.stevenlevithan.com/archives/date-time-format написав format()функцію для JavascriptDate об’єкта , тому його можна використовувати у знайомих буквальних форматах.

Якщо вам потрібно повноформатне форматування дати у Javascript вашого додатка, використовуйте його. Інакше, якщо те, що ви хочете зробити, це одноразовий, то, можливо, найпростіше поєднати getYear (), getMonth (), getDay ().


4

Працюючи з відповіді @ oo, це поверне вам рядок дати відповідно до рядка формату. Ви можете легко додати двозначний рігекс року за рік і мілісекунди і такий, якщо вони вам потрібні.

Date.prototype.getFromFormat = function(format) {
    var yyyy = this.getFullYear().toString();
    format = format.replace(/yyyy/g, yyyy)
    var mm = (this.getMonth()+1).toString(); 
    format = format.replace(/mm/g, (mm[1]?mm:"0"+mm[0]));
    var dd  = this.getDate().toString();
    format = format.replace(/dd/g, (dd[1]?dd:"0"+dd[0]));
    var hh = this.getHours().toString();
    format = format.replace(/hh/g, (hh[1]?hh:"0"+hh[0]));
    var ii = this.getMinutes().toString();
    format = format.replace(/ii/g, (ii[1]?ii:"0"+ii[0]));
    var ss  = this.getSeconds().toString();
    format = format.replace(/ss/g, (ss[1]?ss:"0"+ss[0]));
    return format;
};

d = new Date();
var date = d.getFromFormat('yyyy-mm-dd hh:ii:ss');
alert(date);

Я не знаю, наскільки це ефективно, особливо мудро, оскільки він використовує багато регексу. Можливо, це могло б використовувати якусь роботу, я не опановую чисті js.


4

Цей код виправлено у відповідь П'єра Гільберта:

(працює навіть після 10000 років)

YYYYMMDD=new Date().toISOString().slice(0,new Date().toISOString().indexOf("T")).replace(/-/g,"")


3

Я зазвичай використовую код нижче, коли мені потрібно це зробити.

var date = new Date($.now());
var dateString = (date.getFullYear() + '-'
    + ('0' + (date.getMonth() + 1)).slice(-2)
    + '-' + ('0' + (date.getDate())).slice(-2));
console.log(dateString); //Will print "2015-09-18" when this comment was written

Для пояснення .slice (-2) дає нам два останні символи рядка.

Тож незалежно від того, ми можемо додати "0" до дня чи місяця, і просто попросити останні два, оскільки це завжди два, яких ми хочемо.

Отже, якщо MyDate.getMonth () поверне 9, це буде:

("0" + "9") // Giving us "09"

тому додавання .slice (-2) дає нам два останні символи, які:

("0" + "9").slice(-2)

"09"

Але якщо date.getMonth () поверне 10, це буде:

("0" + "10") // Giving us "010"

тому додавання .slice (-2) дає нам два останні символи, або:

("0" + "10").slice(-2)

"10"

3

Якщо ви використовуєте AngularJs (до 1,5), ви можете використовувати фільтр дат :

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')

3

Відповідь на іншу для простоти та читабельності.
Також не рекомендується редагувати наявні попередньо визначені члени класу новими методами:

function getDateInYYYYMMDD() {
    let currentDate = new Date();

    // year
    let yyyy = '' + currentDate.getFullYear();

    // month
    let mm = ('0' + (currentDate.getMonth() + 1));  // prepend 0 // +1 is because Jan is 0
    mm = mm.substr(mm.length - 2);                  // take last 2 chars

    // day
    let dd = ('0' + currentDate.getDate());         // prepend 0
    dd = dd.substr(dd.length - 2);                  // take last 2 chars

    return yyyy + "" + mm + "" + dd;
}

var currentDateYYYYMMDD = getDateInYYYYMMDD();
console.log('currentDateYYYYMMDD: ' + currentDateYYYYMMDD);


2

Якщо ви не проти включити додаткову (але маленьку) бібліотеку, Sugar.js надає безліч приємних функціональних можливостей для роботи з датами в JavaScript. Для форматування дати використовуйте функцію форматування :

new Date().format("{yyyy}{MM}{dd}")

2

yyyymmdd=x=>(f=x=>(x<10&&'0')+x,x.getFullYear()+f(x.getMonth()+1)+f(x.getDate()));
alert(yyyymmdd(new Date));


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

У суворому режимі або машинописі замість цього використовується "нехай f, yyyymmdd = x => ...". Функції yyyymmdd і f в іншому випадку не визначені.
Макс


2

Використовуйте padStart :

Date.prototype.yyyymmdd = function() {
    return [
        this.getFullYear(),
        (this.getMonth()+1).toString().padStart(2, '0'), // getMonth() is zero-based
        this.getDate().toString().padStart(2, '0')
    ].join('-');
};

1

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

Виходячи з порядку числення формату ISO Дата, перетворіть у локальний часовий пояс і видаліть нецифрові цифри. тобто:

// monkey patch version
Date.prototype.IsoNum = function (n) {
    var tzoffset = this.getTimezoneOffset() * 60000; //offset in milliseconds
    var localISOTime = (new Date(this - tzoffset)).toISOString().slice(0,-1);
    return localISOTime.replace(/[-T:\.Z]/g, '').substring(0,n || 20); // YYYYMMDD
}

Використання

var d = new Date();
// Tue Jul 28 2015 15:02:53 GMT+0200 (W. Europe Daylight Time)
console.log(d.IsoNum(8));  // "20150728"
console.log(d.IsoNum(12)); // "201507281502"
console.log(d.IsoNum());   // "20150728150253272"

1

Рідний Javascript:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');

1
Це не обмежує місяці цифрою 0, щоб місяць був двозначним.
Attila Szeremi

Ти правий. Пізніше я сам це помітив. Ви повинні ретельно перевірити форматування дати у двозначних місяцях та днях.
Lonnie Best
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.