Дату 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.