Формат даты JavaScript в формате гггг-мм-дд


383

У меня свидание с форматом Sun May 11,2014. Как я могу преобразовать это в 2014-05-11использование JavaScript?

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
Черная мамба


Связанный: Каковы действительные строки даты и времени в JavaScript? Обратите внимание, что «Sun May 11,2014» не является допустимой строкой даты, и в некоторых браузерах ее анализ может завершиться ошибкой.
ул

Ответы:


525

Ты можешь сделать:

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, он может быть переформатирован в меньшем количестве кода без использования Date вообще.
RobG

Как увеличить более 30 дней в диапазоне 1 ~ 31?
Стив Анджело

457

Просто используйте встроенный 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]

239
БУДЬТЕ ОСТОРОЖНЫ с этим методом, поскольку он сначала преобразует дату в 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, мне пришлось вычесть, а не добавить смещение, чтобы получить правильную дату (измените на + (offseta - (offset)
рококо

135

Я использую этот способ, чтобы получить дату в формате гггг-мм-дд :)

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

14
Как вы справляетесь с переключением даты на день, как упомянуто здесь @Luke_Baulch?
Malvineous

7
Вы можете сделать это: var todayDate = new Date (); todayDate.setMinutes (todayDate.getMinutes () - todayDate.getTimezoneOffset ()); . todayDate.toISOString () срез (0,10); Это должно помочь избежать проблемы UTC.
Фернандо Агилар

1
@FernandoAguilar Одно сомнение, откуда мы знаем, что нам нужно вычесть смещение или добавить его?
WhyAto8

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

111

Самый простой способ конвертировать вашу дату в формат гггг-мм-дд, это сделать это:

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 )Бит должен устранить любые различия часовых пояса, в том числе влияния перехода на летнее время.
Джон

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
Мне нравится дополнительная гибкость, которую дает это решение по сравнению с другими ответами на этот вопрос. Я не проверил это полностью, но для нужного мне формата (т.е. «гггг-мм-дд чч: мм: сс») он работает так, как ожидалось.
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
Заполнение не существует для двухбуквенного формата. он будет показывать одну цифру, если дата или месяц меньше 10, поэтому не может использовать это напрямую.
Ятендер Сингх,

Да, но это может быть достигнуто просто с помощью javascript, это полностью соответствует вашим требованиям, я так думаю, не так ли? @YatenderSingh
Пардип Джайн

4
да, правильно, но проверьте название формата вопроса "гггг-мм-дд", он хочет :)
Ятендер Сингх

var old_date = new Date (дата); var new_date = old_date.getFullYear () + '-' + (old_date.getMonth () + 1) + '-' + old_date.getDate ()
Ситти Мунира Абдул Разак

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/


9

Получить год, месяц и день, а затем собрать их вместе. Прямо, просто и точно.

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


9

Вы можете использовать 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 стандартным, или эти языки действительно используют этот формат? Если бы это был первый, я бы опасался, что это может неожиданно измениться в будущем.
jymbob

Это не работает с 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)
}

Это должно вернуть день даты, в формате ГГГГ-ММ-ДД, в часовом поясе с указанием даты.

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

Вам нужно будет заполнить Date.prototype.toISOString, чтобы он работал в Internet Explorer 8, но он должен поддерживаться везде.


Возможно, стоит отметить, что это даст вам 2017-08-23, только если вы достаточно отстали от UTC (например, в США).
Саймон Д


3

Я предлагаю использовать что-то вроде formatDate-js вместо того, чтобы пытаться повторять это каждый раз. Просто используйте библиотеку, которая поддерживает все основные действия strftime.

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.
когда-либо Dev

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

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

Это помогло мне получить текущую дату в нужном формате (ГГГГММДД ЧЧ: ММ: СС):

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


Dangerous. В этом случае вы игнорируете смещение часового пояса.
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.