Дату JavaScript відформатуйте у вигляді рр-гм-дд


382

У мене дата з форматом Sun May 11,2014. Як я можу перетворити його на 2014-05-11JavaScript?

function taskDate(dateMilli) {
    var d = (new Date(dateMilli) + '').split(' ');
    d[2] = d[2] + ',';

    return [d[0], d[1], d[2], d[3]].join(' ');
}

var datemilli = Date.parse('Sun May 11,2014');
console.log(taskDate(datemilli));

Вище код дає мені той же формат дати, sun may 11,2014. Як я можу це виправити?


7
Сумніваюсь, що наведений вище код дає вам що-небудь інше, ніж синтаксичну помилку.
— plalx

Дійсно розглянути можливість використання такої бібліотеки, як Moment.js. Він буде форматувати бажаний результат :)
— Ankur

5
Навіщо використовувати бібліотеку, коли 5 рядків коду можуть зробити роботу? @Ankur
— Black Mamba


Пов’язано: Які дійсні строки дати в JavaScript? Зауважте, що "Sun May 11,2014" не є дійсним рядком дати, і його аналіз може виявитися невдалим у деяких браузерах.
— вул.

Відповіді:


524

Ви можете зробити:

function formatDate(date) {
    var d = new Date(date),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();

    if (month.length < 2) 
        month = '0' + month;
    if (day.length < 2) 
        day = '0' + day;

    return [year, month, day].join('-');
}

Приклад використання:

alert(formatDate('Sun May 11,2014'));

Вихід:

2014-05-11

Демонстрація на JSFiddle: http://jsfiddle.net/abdulrauf6182012/2Frm3/


11
Дійсно кілька оголошень змінної в одному і тому самому операторі? stackoverflow.com/questions/694102 / ...
— bhspencer

8
@ Fuser97381 Кілька декларацій змінної в одному висловлюванні є більш ніж просто естетичним вподобанням стилю. Це небезпечна практика. Якщо ви ненавмисно не вдається додати кому після кожного оголошення, ви в кінцевому підсумку створюєте глобальні змінні. Не те, що слід заохочувати, що може стати канонічною відповіддю на запитання.
— bhspencer

6
'use strict';@bhspencer
— Vix

3
Переформатування рядка дати не повинно залежати від успішного розбору нестандартних рядків за допомогою вбудованого аналізатора. Враховуючи формат OP, його можна переформатувати на менше коду, не використовуючи дату взагалі.
— RobG

Як збільшувати більше 30 днів у діапазоні 1 ~ 31?
— Стів

456

Просто використовуйте вбудований toISOStringметод, який приводить вашу дату у формат ISO 8601:

yourDate.toISOString().split('T')[0]

Там, де yourDate - ваш об’єкт дати.

Редагувати: якийсь хлопець написав це, щоб обробити часовий пояс у коментарях:

const offset = yourDate.getTimezoneOffset()
yourDate = new Date(yourDate.getTime() + (offset*60*1000))
return yourDate.toISOString().split('T')[0]

238
Будьте уважні з цим методом, оскільки він спочатку перетворює дату на UTC. Якщо ви перебуваєте в часовому поясі +, і ваш час є рано вдень, то це може повернутись на день. Крім того, якщо ви знаходитесь у часовому поясі, а ваша часова частина запізнюється вдень, то це може просунутись на день.
— Люк Баулч

4
Спробуйте замість цього:new Date(yourDateStr).toISOString().split('T')[0]
— exbuddha

24
const offset = yourDate.getTimezoneOffset(); yourDate = new Date(yourDate.getTime() + (offset*60*1000)); yourDate.toISOString().split('T')[0] це має вирішити питання про часовий пояс
— mjwrazor

5
now.toISOString().substring(0,10); Це більш чиста альтернатива, оскільки вона нагадує вам, що YYYY-MM-DDце перші десять символів повного формату iso
— Gutimore

4
Примітка. Користуючись корисним рішенням, прокоментованим @mjwrazor, мені довелося відняти замість додавання зміщення, щоб отримати правильну дату (змінити + (offsetна а - (offset)
— rococo

135

Я використовую цей спосіб, щоб отримати дату у форматі yyyy-mm-dd :)

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

14
Як ви керуєтесь переключенням дати на день, про який згадував тут @Luke_Baulch?
— Malvineous

7
Ви можете зробити це: var todayDate = new Date (); todayDate.setMinutes (todayDate.getMinutes () - сьогодніDate.getTimezoneOffset ()); сьогодніDate.toISOString (). зріз (0,10); Це повинно допомогти уникнути проблеми з UTC.
— Фернандо Агілар

1
@FernandoAguilar Один сумнів, однак, як ми знаємо, що нам потрібно відняти зміщення або додати його?
— чомуAto8

var todayDate = new Date(2018, 3 - 1, 26); todayDate.toISOString().slice(0, 10);дає мені "2018-03-25". По іншій системі var todayDate = new Date(2018, 3 - 1, 26, 17, 0, 0); todayDate.toISOString().slice(0, 10);мене дає "2018-03-27".
— Салман А

2
Це не завжди працює. Іноді це віднімає день через перетворення UTC.
— NickG

110

Найпростіший спосіб конвертувати свою дату у формат yyyy-mm-dd - це зробити:

var date = new Date("Sun May 11,2014");
var dateString = new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))
                    .toISOString()
                    .split("T")[0];

Як це працює:

  • new Date("Sun May 11,2014")перетворює рядок "Sun May 11,2014"в об'єкт дати, який представляє час Sun May 11 2014 00:00:00у часовому поясі на основі поточного локалу (налаштування системи хоста)
  • new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))перетворює вашу дату в об'єкт дати, що відповідає часу Sun May 11 2014 00:00:00в UTC (стандартний час), віднімаючи зміщення часового поясу
  • .toISOString() перетворює об'єкт дати в рядок ISO 8601 2014-05-11T00:00:00.000Z
  • .split("T") розбиває рядок на масив ["2014-05-11", "00:00:00.000Z"]
  • [0] бере перший елемент цього масиву

Демо

var date = new Date("Sun May 11,2014");
var dateString = new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))
                    .toISOString()
                    .split("T")[0];

console.log(dateString);


20
Ніхто більше не переживає, що це найпростіший спосіб ??
— розрив

.toISOString () не працює належним чином при економії літнього часу.
— Ідеї ​​Джо,

2
@JoeDevmon: Я не бачу, наскільки це актуально тут. - (date.getTimezoneOffset() * 60000 )Біт повинен усунути будь-які відмінності часових пояси, в тому числі впливу переходу на літній час.
— John Slegers

2
@JohnSlegers - це те, про що я думав, але тоді я все-таки отримував день раніше в деяких випадках. Я відремонтувався і ваш приклад працює зараз. У мене, мабуть, був дивний рядок з датами чи щось таке. Дякуємо, що дотримувались цього та вказували на це. +1 👍
— Ідеї ​​Джо

2
Я шукав високий і низький рівень SO та інших сайтів, щоб знайти найкращий спосіб вирішити проблеми часового поясу з датами в JS, і знизити руки, це, безумовно, найпростіший і найкращий. Дякую!
— HartleySan

34
format = function date2str(x, y) {
    var z = {
        M: x.getMonth() + 1,
        d: x.getDate(),
        h: x.getHours(),
        m: x.getMinutes(),
        s: x.getSeconds()
    };
    y = y.replace(/(M+|d+|h+|m+|s+)/g, function(v) {
        return ((v.length > 1 ? "0" : "") + eval('z.' + v.slice(-1))).slice(-2)
    });

    return y.replace(/(y+)/g, function(v) {
        return x.getFullYear().toString().slice(-v.length)
    });
}

Результат:

format(new Date('Sun May 11,2014'), 'yyyy-MM-dd')
"2014-05-11

1
Мені подобається додаткова гнучкість, яку надає це рішення порівняно з іншими відповідями на це питання. Я не ретельно перевірив це, але для потрібного формату (наприклад, "yyyy-MM-dd hh: mm: ss") він працює так, як очікувалося.
— porcus

3
Ви могли б легко уникнути eval.
— Салман

3
ось версія, яка краще уникає eval та коментує jsfiddle.net/8904cmLd/2
— m1m1k

2
Я отримав користь від цієї відповіді. Я замінив цей рядок на заяву eval наreturn ((v.length > 1 ? "0" : "") + z[v.slice(-1)]).slice(-2);
— JesusIsMyDriver.dll

26

Поєднання деяких відповідей:

var d = new Date(date);
date = [
  d.getFullYear(),
  ('0' + (d.getMonth() + 1)).slice(-2),
  ('0' + d.getDate()).slice(-2)
].join('-');

Рішення мені подобається найкраще - легко читати, а не покладатися на toISOString()потенційні підводні камені часового поясу при використанні цієї функції.
— matt.fc

це перший, який не заподіює мені головний мозок.
— ckapilla

22

Якщо у вас немає нічого проти використання бібліотек, ви можете просто використовувати бібліотеку Moments.js так:

var now = new Date();
var dateString = moment(now).format('YYYY-MM-DD');

var dateStringWithTime = moment(now).format('YYYY-MM-DD HH:mm:ss');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>


Класне рішення, але його пакет від 300 кб
— Адам

13

Просто скористайтеся цим:

var date = new Date('1970-01-01'); // Or your date here
console.log((date.getMonth() + 1) + '/' + date.getDate() + '/' +  date.getFullYear());

Просте і миле;)


4
прокладки немає для формату 2 літер. він відображатиметься однозначним, якщо дата чи місяць менше 10, тому не можна використовувати це безпосередньо.
— Yatender Singh

Так, але це можна досягти просто за допомогою javascript, його загалом відповідає вашим вимогам, я думаю, що так, чи не так? @YatenderSingh
— Pardeep Jain

4
так, але правильно, але перевірте заголовок питання "yyyy-mm-dd", який він хоче :)
— Yatender Singh

var old_date = нова дата (дата); var new_date = old_date.getFullYear () + '-' + (old_date.getMonth () + 1) + '-' + old_date.getDate ()
— Sitti Munirah Abdul Razak

1
Чудово. Це спрацювало і було просто і стисло!
— Waleed93

12

toISOString()передбачає, що ваша дата - місцевий час, і перетворює її в UTC. Ви отримаєте неправильний рядок дати.

Наступний метод повинен повернути те, що вам потрібно.

Date.prototype.yyyymmdd = function() {         

    var yyyy = this.getFullYear().toString();                                    
    var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based         
    var dd  = this.getDate().toString();             

    return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};

Джерело: https://blog.justin.kelly.org.au/simple-javascript-function-to-format-the-date-as-yyyy-mm-dd/


8

Отримайте рік, місяць і день, а потім складіть їх разом. Прямий, простий і точний.

function formatDate(date) {
    var year = date.getFullYear().toString();
    var month = (date.getMonth() + 101).toString().substring(1);
    var day = (date.getDate() + 100).toString().substring(1);
    return year + "-" + month + "-" + day;
}

//Usage example:
alert(formatDate(new Date()));


8

Ви можете використовувати toLocaleDateString('fr-CA')на Dateоб'єкті

console.log(new Date('Sun May 11,2014').toLocaleDateString('fr-CA'));

Також я дізнався, що ці локалі дають правильний результат із цього списку локалів та їхніх коротких кодів?

'en-CA'
'fr-CA'
'lt-LT'
'sv-FI'
'sv-SE'


Будь-яка ідея, чому це працює? Формат ISO - лише стандартний формат, чи ці локали справді використовують цей формат? Якщо це колишній, я б переймався тим, що це може несподівано змінитися в майбутньому.
— джимбоб

Це не працює з NodeJS за межами браузера.
— Донато

@jymbob Я думаю, що ці локалі справді використовують ці формати. Я прийшов до тієї самої відповіді, переглянувши цю сторінку Вікіпедії: en.wikipedia.org/wiki/Date_format_by_country
— Ciprian Tomoiagă

5

Щоб врахувати і часовий пояс, цей одноклапник повинен бути гарним без будь-якої бібліотеки:

new Date().toLocaleString("en-IN", {timeZone: "Asia/Kolkata"}).split(',')[0]

5

Ви можете спробувати це: https://www.npmjs.com/package/timesolver

npm i timesolver

Використовуйте його у своєму коді:

const timeSolver = require('timeSolver');
const date = new Date();
const dateString = timeSolver.getString(date, "YYYY-MM-DD");

Ви можете отримати рядок дати, використовуючи цей метод:

getString

4

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

Ось що я придумав:

function localDay(time) {
  var minutesOffset = time.getTimezoneOffset()
  var millisecondsOffset = minutesOffset*60*1000
  var local = new Date(time - millisecondsOffset)
  return local.toISOString().substr(0, 10)
}

Це повинно повернути день дати у форматі РРРР-ММ-DD у часовий пояс, на який посилаються дати.

Так, наприклад, localDay(new Date("2017-08-24T03:29:22.099Z"))повернеться, "2017-08-23"хоча це вже 24-е в UTC.

Вам потрібно polyfill Date.prototype.toISOString для того , щоб працювати в Internet Explorer 8, але вона повинна бути підтримана всюди.


Можливо, варто відзначити, що він дасть вам 2017-08-23, лише якщо ви достатньо відстаєте від UTC (наприклад, у США).
— Саймон Д

3

Я пропоную використовувати щось на зразок formatDate-js, а не намагатися повторювати його кожен раз. Просто використовуйте бібліотеку, яка підтримує всі основні дії стрилору.

new Date().format("%Y-%m-%d")

3
new Date().toLocaleDateString('pt-br').split( '/' ).reverse( ).join( '-' );

або

new Date().toISOString().split('T')[0]
new Date('23/03/2020'.split('/').reverse().join('-')).toISOString()
new Date('23/03/2020'.split('/').reverse().join('-')).toISOString().split('T')[0]

Спробуйте це!


Другий варіант може відображати неправильну дату, оскільки він відображатиме дані в часовому поясі UTC.
— Колись Дев

2

Ось один із способів зробити це:

var date = Date.parse('Sun May 11,2014');

function format(date) {
  date = new Date(date);

  var day = ('0' + date.getDate()).slice(-2);
  var month = ('0' + (date.getMonth() + 1)).slice(-2);
  var year = date.getFullYear();

  return year + '-' + month + '-' + day;
}

console.log(format(date));

2

Date.js чудово підходить для цього.

require("datejs")
(new Date()).toString("yyyy-MM-dd")

1

function myYmd(D){
    var pad = function(num) {
        var s = '0' + num;
        return s.substr(s.length - 2);
    }
    var Result = D.getFullYear() + '-' + pad((D.getMonth() + 1)) + '-' + pad(D.getDate());
    return Result;
}

var datemilli = new Date('Sun May 11,2014');
document.write(myYmd(datemilli));


1

var d = new Date("Sun May 1,2014");

var year  = d.getFullYear();
var month = d.getMonth() + 1;
var day   = d.getDate(); 

month = checkZero(month);             
day   = checkZero(day);

var date = "";

date += year;
date += "-";
date += month;
date += "-";
date += day;

document.querySelector("#display").innerHTML = date;
    
function checkZero(i) 
{
    if (i < 10) 
    {
        i = "0" + i
    };  // add zero in front of numbers < 10

    return i;
}
<div id="display"></div>


1
new Date(new Date(YOUR_DATE.toISOString()).getTime() - 
                 (YOUR_DATE.getTimezoneOffset() * 60 * 1000)).toISOString().substr(0, 10)

1

Кілька попередніх відповідей були в порядку, але вони не були дуже гнучкими. Мені хотілося чогось, що справді могло б вирішити більш кращі випадки, тому я взяв відповідь @orangleliu і розширив її.https://jsfiddle.net/8904cmLd/1/

function DateToString(inDate, formatString) {
    // Written by m1m1k 2018-04-05

    // Validate that we're working with a date
    if(!isValidDate(inDate))
    {
        inDate = new Date(inDate);
    }

    // See the jsFiddle for extra code to be able to use DateToString('Sun May 11,2014', 'USA');
    //formatString = CountryCodeToDateFormat(formatString);

    var dateObject = {
        M: inDate.getMonth() + 1,
        d: inDate.getDate(),
        D: inDate.getDate(),
        h: inDate.getHours(),
        m: inDate.getMinutes(),
        s: inDate.getSeconds(),
        y: inDate.getFullYear(),
        Y: inDate.getFullYear()
    };

    // Build Regex Dynamically based on the list above.
    // It should end up with something like this: "/([Yy]+|M+|[Dd]+|h+|m+|s+)/g"
    var dateMatchRegex = joinObj(dateObject, "+|") + "+";
    var regEx = new RegExp(dateMatchRegex,"g");
    formatString = formatString.replace(regEx, function(formatToken) {
        var datePartValue = dateObject[formatToken.slice(-1)];
        var tokenLength = formatToken.length;

        // A conflict exists between specifying 'd' for no zero pad -> expand
        // to '10' and specifying yy for just two year digits '01' instead
        // of '2001'.  One expands, the other contracts.
        //
        // So Constrict Years but Expand All Else
        if (formatToken.indexOf('y') < 0 && formatToken.indexOf('Y') < 0)
        {
            // Expand single digit format token 'd' to
            // multi digit value '10' when needed
            var tokenLength = Math.max(formatToken.length, datePartValue.toString().length);
        }
        var zeroPad = (datePartValue.toString().length < formatToken.length ? "0".repeat(tokenLength) : "");
        return (zeroPad + datePartValue).slice(-tokenLength);
    });

    return formatString;
}

Приклад використання:

DateToString('Sun May 11,2014', 'MM/DD/yy');
DateToString('Sun May 11,2014', 'yyyy.MM.dd');
DateToString(new Date('Sun Dec 11,2014'),'yy-M-d');

Приємне чисте та прокоментоване рішення. І все ж я скептично ставлюсь до першого аргументу, який мовчки замінюється новою новою датою, якщо не визнається дійсною датою. Я волів би поставити цей «optionnal значення по замовчуванням» в якості 2 - го аргументу замість цього, і повертати які - то виключення (може бути просто "Неприпустимий формат дати» повертається рядок) в разі , якщо формат не розпізнає, так що помилка з'являється явно в тестер / користувач
— Balmipour

1

Це працювало для мене, щоб отримати поточну дату в потрібному форматі (РРРРММДД HH: MM: SS):

var d = new Date();

var date1 = d.getFullYear() + '' +
            ((d.getMonth()+1) < 10 ? "0" + (d.getMonth() + 1) : (d.getMonth() + 1)) +
            '' +
            (d.getDate() < 10 ? "0" + d.getDate() : d.getDate());

var time1 = (d.getHours() < 10 ? "0" + d.getHours() : d.getHours()) +
            ':' +
            (d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes()) +
            ':' +
            (d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds());

print(date1+' '+time1);

1

Бібліотека не потрібна

Просто чистий JavaScript.

Нижче наведений приклад: останні два місяці:

var d = new Date()
d.setMonth(d.getMonth() - 2);
var dateString = new Date(d);
console.log('Before Format', dateString, 'After format', dateString.toISOString().slice(0,10))


Небезпечний. У цьому випадку ви ігноруєте зміщення часового поясу.
— maxence51

1

Формат дати, сумісний з PHP

Ось невелика функція, яка може приймати ті самі параметри, що і функція PHP date() і і повертати рядок дати / часу в JavaScript.

Зверніть увагу, що не всі параметри формату date () від PHP підтримуються. Ви можете розширити partsоб'єкт для створення відсутнього маркера формату

/**
 * Date formatter with PHP "date()"-compatible format syntax.
 */
const formatDate = (format, date) => {
  if (!format) { format = 'Y-m-d' }
  if (!date) { date = new Date() }

  const parts = {
    Y: date.getFullYear().toString(),
    y: ('00' + (date.getYear() - 100)).toString().slice(-2),
    m: ('0' + (date.getMonth() + 1)).toString().slice(-2),
    n: (date.getMonth() + 1).toString(),
    d: ('0' + date.getDate()).toString().slice(-2),
    j: date.getDate().toString(),
    H: ('0' + date.getHours()).toString().slice(-2),
    G: date.getHours().toString(),
    i: ('0' + date.getMinutes()).toString().slice(-2),
    s: ('0' + date.getSeconds()).toString().slice(-2)
  }

  const modifiers = Object.keys(parts).join('')
  const reDate = new RegExp('(?<!\\\\)[' + modifiers + ']', 'g')
  const reEscape = new RegExp('\\\\([' + modifiers + '])', 'g')

  return format
    .replace(reDate, $0 => parts[$0])
    .replace(reEscape, ($0, $1) => $1)
}

// ----- EXAMPLES -----
console.log( formatDate() ); // "2019-05-21"
console.log( formatDate('H:i:s') ); // "16:21:32"
console.log( formatDate('Y-m-d, o\\n H:i:s') ); // "2019-05-21, on 16:21:32"
console.log( formatDate('Y-m-d', new Date(2000000000000)) ); // "2033-05-18"

Суть

Ось зміст із оновленою версією formatDate()функції та додатковими прикладами: https://gist.github.com/stracker-phil/c7b68ea0b1d5bbb97af0a6a3dc66e0d9


0

Ще одна комбінація відповідей. Приємно читабельний, але трохи тривалий.

function getCurrentDayTimestamp() {
  const d = new Date();

  return new Date(
    Date.UTC(
      d.getFullYear(),
      d.getMonth(),
      d.getDate(),
      d.getHours(),
      d.getMinutes(),
      d.getSeconds()
    )
  // `toIsoString` returns something like "2017-08-22T08:32:32.847Z"
  // and we want the first part ("2017-08-22")
  ).toISOString().slice(0, 10);
}

0

Якщо дата повинна бути однаковою для всіх часових поясів, наприклад, представляє деяке значення в базі даних, тоді обов'язково використовуйте UTC-версії дня, місяця, повнофункціонуйте функції об’єкта дати JavaScript, оскільки це відображатиметься в UTC час та уникайте поодиноких помилок у певних часових поясах.

Ще краще використовувати бібліотеку дат Moment.js для такого форматування.



0

Форматування та знаходження максимальної та мінімальної дати з даних хешмапу:

var obj = {"a":'2001-15-01', "b": '2001-12-02' , "c": '2001-1-03'};

function findMaxMinDate(obj){
  let formatEncode = (id)=> { let s = id.split('-'); return `${s[0]+'-'+s[2]+'-'+s[1]}`}
  let formatDecode = (id)=> { let s = id.split('/'); return `${s[2]+'-'+s[0]+'-'+s[1]}`}
  let arr = Object.keys( obj ).map(( key )=> { return new Date(formatEncode(obj[key])); });
  let min = new Date(Math.min.apply(null, arr)).toLocaleDateString();
  let max = new Date(Math.max.apply(null, arr)).toLocaleDateString();
  return {maxd: `${formatDecode(max)}`, mind:`${formatDecode(min)}`}
}

console.log(findMaxMinDate(obj));


Як це пов’язано з питанням (форматування дати)?
— Пітер Мортенсен

0

Переформатування рядка дати є досить простим, наприклад, наприклад

var s = 'Sun May 11,2014';

function reformatDate(s) {
  function z(n){return ('0' + n).slice(-2)}
  var months = [,'jan','feb','mar','apr','may','jun',
                 'jul','aug','sep','oct','nov','dec'];
  var b = s.split(/\W+/);
  return b[3] + '-' +
    z(months.indexOf(b[1].substr(0,3).toLowerCase())) + '-' +
    z(b[2]);
}

console.log(reformatDate(s));

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