Формат даты 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. Как я могу это исправить?

user3625547
источник
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/

user3470953
источник
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
orangleliu
источник
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('-');
aqwsez
источник
Мне нравится решение лучше всего - его легко читать, и я не полагаюсь на 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/

user1920925
источник
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]
krsoni
источник
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
sean1093
источник
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

Date.js отлично подходит для этого.

require("datejs")
(new Date()).toString("yyyy-MM-dd")
Тан Ван
источник
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>

antelove
источник
1
new Date(new Date(YOUR_DATE.toISOString()).getTime() - 
                 (YOUR_DATE.getTimezoneOffset() * 60 * 1000)).toISOString().substr(0, 10)
Lin
источник
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');
m1m1k
источник
Хорошее чистое и закомментированное решение. И все же я скептически отношусь к первому аргументу, который молча заменяется новой новой датой, если она не признана действительной датой. Я предпочел бы поставить этот «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);
SaP
источник
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

Philipp
источник
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);
}
kadrian
источник
0

Если дата должна быть одинаковой во всех часовых поясах, например, представляет какое-то значение из базы данных, то обязательно используйте UTC-версии дня, месяца, полностью годичных функций в объекте даты JavaScript, так как это будет отображаться во времени UTC и Избегайте ошибок в определенных часовых поясах.

Еще лучше использовать библиотеку дат Moment.js для такого рода форматирования.

GameSalutes
источник
0

Я изменил ответ Самита Сатпута следующим образом:

var newstartDate = new Date();
// newstartDate.setDate(newstartDate.getDate() - 1);
var startDate = newstartDate.toISOString().replace(/[-T:\.Z]/g, ""); //.slice(0, 10); // To get the Yesterday's Date in YYYY MM DD Format
console.log(startDate);

Сулеман
источник
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));

KARTHIKEYAN.A
источник
Как это связано с вопросом (форматированием даты)?
Питер Мортенсен
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));

RobG
источник