Формат JavaScript Дата в гггг-мм-дд

Привет всем, у меня есть формат даты 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');
taskdate(datemilli);

Приведенный выше код дает мне тот же формат даты ВС мая 11,2014, пожалуйста, помогите

56 ответов

Решение

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

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

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

Просто используйте встроенный toISOString метод, который переводит вашу дату в формат ISO 8601

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

где yourDate - ваш объект даты.

ОТВЕТ 2020

Вы можете использовать родной .toLocaleDateString()функция, которая поддерживает несколько полезных параметров, таких как локаль (для выбора формата, например ММ / ДД / ГГГГ или ГГГГ / ММ / ДД), часовой пояс (для преобразования даты) и параметры подробностей форматирования (например: 1 против 01 против января).

Примеры

new Date().toLocaleDateString() // 8/19/2020

new Date().toLocaleDateString('en-US', {year: 'numeric', month: '2-digit', day: '2-digit'}); // 08/19/2020 (month and day with two digits)

new Date().toLocaleDateString('en-ZA'); // 2020/08/19 (year/month/day) notice the different locale

new Date().toLocaleString("en-US", {timeZone: "America/New_York"}); // 8/19/2020, 9:29:51 AM. (date and time in a specific timezone)

new Date().toLocaleString("en-US", {hour: '2-digit', hour12: false, timeZone: "America/New_York"});  // 09 (just the hour)

Обратите внимание, что иногда для вывода даты в желаемом формате вам нужно найти совместимый языковой стандарт с этим форматом. Вы можете найти примеры языковых стандартов здесь: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_tolocalestring_date_all

Обратите внимание, что языковой стандарт просто меняет формат, если вы хотите преобразовать конкретную дату в эквивалент времени конкретной страны или города, вам необходимо использовать параметр часового пояса.

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

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

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

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

Сочетание некоторых ответов:

var d = new Date(date);
date = [
  d.getFullYear(),
  ('0' + (d.getMonth() + 1)).slice(-2),
  ('0' + d.getDate()).slice(-2)
].join('-');
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

Если у вас нет ничего против использования библиотек; Вы могли бы просто использовать библиотеку моментов.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>

Вы можете использовать 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'

var localesList = ["af-ZA",
  "am-ET",
  "ar-AE",
  "ar-BH",
  "ar-DZ",
  "ar-EG",
  "ar-IQ",
  "ar-JO",
  "ar-KW",
  "ar-LB",
  "ar-LY",
  "ar-MA",
  "arn-CL",
  "ar-OM",
  "ar-QA",
  "ar-SA",
  "ar-SY",
  "ar-TN",
  "ar-YE",
  "as-IN",
  "az-Cyrl-AZ",
  "az-Latn-AZ",
  "ba-RU",
  "be-BY",
  "bg-BG",
  "bn-BD",
  "bn-IN",
  "bo-CN",
  "br-FR",
  "bs-Cyrl-BA",
  "bs-Latn-BA",
  "ca-ES",
  "co-FR",
  "cs-CZ",
  "cy-GB",
  "da-DK",
  "de-AT",
  "de-CH",
  "de-DE",
  "de-LI",
  "de-LU",
  "dsb-DE",
  "dv-MV",
  "el-GR",
  "en-029",
  "en-AU",
  "en-BZ",
  "en-CA",
  "en-GB",
  "en-IE",
  "en-IN",
  "en-JM",
  "en-MY",
  "en-NZ",
  "en-PH",
  "en-SG",
  "en-TT",
  "en-US",
  "en-ZA",
  "en-ZW",
  "es-AR",
  "es-BO",
  "es-CL",
  "es-CO",
  "es-CR",
  "es-DO",
  "es-EC",
  "es-ES",
  "es-GT",
  "es-HN",
  "es-MX",
  "es-NI",
  "es-PA",
  "es-PE",
  "es-PR",
  "es-PY",
  "es-SV",
  "es-US",
  "es-UY",
  "es-VE",
  "et-EE",
  "eu-ES",
  "fa-IR",
  "fi-FI",
  "fil-PH",
  "fo-FO",
  "fr-BE",
  "fr-CA",
  "fr-CH",
  "fr-FR",
  "fr-LU",
  "fr-MC",
  "fy-NL",
  "ga-IE",
  "gd-GB",
  "gl-ES",
  "gsw-FR",
  "gu-IN",
  "ha-Latn-NG",
  "he-IL",
  "hi-IN",
  "hr-BA",
  "hr-HR",
  "hsb-DE",
  "hu-HU",
  "hy-AM",
  "id-ID",
  "ig-NG",
  "ii-CN",
  "is-IS",
  "it-CH",
  "it-IT",
  "iu-Cans-CA",
  "iu-Latn-CA",
  "ja-JP",
  "ka-GE",
  "kk-KZ",
  "kl-GL",
  "km-KH",
  "kn-IN",
  "kok-IN",
  "ko-KR",
  "ky-KG",
  "lb-LU",
  "lo-LA",
  "lt-LT",
  "lv-LV",
  "mi-NZ",
  "mk-MK",
  "ml-IN",
  "mn-MN",
  "mn-Mong-CN",
  "moh-CA",
  "mr-IN",
  "ms-BN",
  "ms-MY",
  "mt-MT",
  "nb-NO",
  "ne-NP",
  "nl-BE",
  "nl-NL",
  "nn-NO",
  "nso-ZA",
  "oc-FR",
  "or-IN",
  "pa-IN",
  "pl-PL",
  "prs-AF",
  "ps-AF",
  "pt-BR",
  "pt-PT",
  "qut-GT",
  "quz-BO",
  "quz-EC",
  "quz-PE",
  "rm-CH",
  "ro-RO",
  "ru-RU",
  "rw-RW",
  "sah-RU",
  "sa-IN",
  "se-FI",
  "se-NO",
  "se-SE",
  "si-LK",
  "sk-SK",
  "sl-SI",
  "sma-NO",
  "sma-SE",
  "smj-NO",
  "smj-SE",
  "smn-FI",
  "sms-FI",
  "sq-AL",
  "sr-Cyrl-BA",
  "sr-Cyrl-CS",
  "sr-Cyrl-ME",
  "sr-Cyrl-RS",
  "sr-Latn-BA",
  "sr-Latn-CS",
  "sr-Latn-ME",
  "sr-Latn-RS",
  "sv-FI",
  "sv-SE",
  "sw-KE",
  "syr-SY",
  "ta-IN",
  "te-IN",
  "tg-Cyrl-TJ",
  "th-TH",
  "tk-TM",
  "tn-ZA",
  "tr-TR",
  "tt-RU",
  "tzm-Latn-DZ",
  "ug-CN",
  "uk-UA",
  "ur-PK",
  "uz-Cyrl-UZ",
  "uz-Latn-UZ",
  "vi-VN",
  "wo-SN",
  "xh-ZA",
  "yo-NG",
  "zh-CN",
  "zh-HK",
  "zh-MO",
  "zh-SG",
  "zh-TW",
  "zu-ZA"
];

localesList.forEach(lcl => {
  if ("2014-05-11" === new Date('Sun May 11,2014').toLocaleDateString(lcl)) {
    console.log(lcl, new Date('Sun May 11,2014').toLocaleDateString(lcl));
  }
});

Решение 2021 года с использованием.

Новый IntlОбъект теперь поддерживается во всех браузерах.
Вы можете выбрать формат, выбрав «локаль», в которой используется требуемый формат.

В шведской локали используется формат «гггг-мм-дд»:

      // Create a date
const date = new Date(2021, 10, 28);

// Create a formatter using the "sv-SE" locale
const dateFormatter = Intl.DateTimeFormat('sv-SE');

// Use the formatter to format the date
console.log(dateFormatter.format(date)); // "2021-11-28"

Недостатки использования Intl:

  • Вы не можете «неформатировать» или «разбирать» строки с помощью этого метода.
  • Вы должны искать требуемый формат (например, в Википедии ) и не можете использовать строку формата, такую ​​как "гггг-мм-дд"

Самый короткий

.toJSON().slice(0,10);

var d = new Date('Sun May 11,2014' +' UTC');   // Parse as UTC
let str = d.toJSON().slice(0,10);              // Show as UTC

console.log(str);

В большинстве случаев (без обработки часовых поясов) этого достаточно:

      date.toISOString().substring(0,10)

Почему бы просто не использовать это

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

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

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/

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]

Попробуй это!

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

alert(formatDate(new Date()));

const formatDate = d => [
    d.getFullYear(),
    (d.getMonth() + 1).toString().padStart(2, '0'),
    d.getDate().toString().padStart(2, '0')
].join('-');

Вы можете использовать padstart

Когда ES2018 вращается (работает в хроме), вы можете просто использовать регулярное выражение

(new Date())
    .toISOString()
    .replace(
        /^(?<year>\d+)-(?<month>\d+)-(?<day>\d+)T.*$/,
        '$<year>-$<month>-$<day>'
    )

2020-07-14

Или если вам нужно что-то довольно универсальное без каких-либо библиотек

(new Date())
    .toISOString()
    .match(
        /^(?<yyyy>\d\d(?<yy>\d\d))-(?<mm>0?(?<m>\d+))-(?<dd>0?(?<d>\d+))T(?<HH>0?(?<H>\d+)):(?<MM>0?(?<M>\d+)):(?<SSS>(?<SS>0?(?<S>\d+))\.\d+)(?<timezone>[A-Z][\dA-Z.-:]*)$/
    )
    .groups

В результате получается следующее

{
    H: "8"
    HH: "08"
    M: "45"
    MM: "45"
    S: "42"
    SS: "42"
    SSS: "42.855"
    d: "14"
    dd: "14"
    m: "7"
    mm: "07"
    timezone: "Z"
    yy: "20"
    yyyy: "2020"
}

Что вы можете использовать так с replace(..., '$<d>/$<m>/\'$<yy> @ $<H>:$<MM>') как наверху вместо .match(...).groups получить

14/7/'20 @ 8:45

К сожалению, у объекта JavaScript есть много подводных камней . Любое решение на основе встроенного <tcode id="46804616"></tcode>должен связываться с часовым поясом, как обсуждалось в некоторых других ответах на этот вопрос. Чистое решение для представления даты ISO-8601 (без времени) дается <tcode id="46804617"></tcode>из предложения . Начиная с февраля 2021 года вы должны выбрать наиболее подходящий для вас обходной путь.

использовать с конкатенацией ванильных строк

Предполагая, что ваше внутреннее представление основано на, вы можете выполнить конкатенацию строк вручную. Следующий код позволяет избежать некоторых ошибок (часовой пояс, месяц с отсчетом от нуля, отсутствие двухзначного форматирования), но могут быть и другие проблемы.

      function vanillaToDateOnlyIso8601() {
  // month May has zero-based index 4
  const date = new Date(2014, 4, 11);

  const yyyy = date.getFullYear();
  const mm = String(date.getMonth() + 1).padStart(2, "0"); // month is zero-based
  const dd = String(date.getDate()).padStart(2, "0");

  if (yyyy < 1583) {
    // TODO: decide how to support dates before 1583
    throw new Error(`dates before year 1583 are not supported`);
  }

  const formatted = `${yyyy}-${mm}-${dd}`;
  console.log("vanilla", formatted);
}

использовать со вспомогательной библиотекой (например, <tcode id="46804624"></tcode>из )

Это популярный подход, но вы все равно вынуждены обрабатывать календарную дату как <tcode id="46804614"></tcode>, который представляет

единый момент времени в независимом от платформы формате

Однако следующий код должен выполнить свою работу:

      import { formatISO } from "date-fns";

function dateFnsToDateOnlyIso8601() {
  // month May has zero-based index 4
  const date = new Date(2014, 4, 11);
  const formatted = formatISO(date, { representation: "date" });
  console.log("date-fns", formatted);
}

найти библиотеку, которая правильно представляет дату и время

Хотелось бы, чтобы была чистая и проверенная в боях библиотека, которая имеет собственные хорошо продуманные представления даты и времени. Перспективным кандидатом на поставленную задачу в этом вопросе был <tcode id="46804628"></tcode> из <tcode id="46804629"></tcode>, но библиотека менее активна, чем, скажем, date-fns. Когда я играл с некоторым примером кода, у меня также были некоторые проблемы после добавления необязательного @js-joda/timezone.

Однако основные функции работают и кажутся мне очень понятными:

      import { LocalDate, Month } from "@js-joda/core";

function jodaDateOnlyIso8601() {
  const someDay = LocalDate.of(2014, Month.MAY, 11);
  const formatted = someDay.toString();
  console.log("joda", formatted);
}

экспериментируйте с <tcode id="46804618"></tcode>-предложение полифилл

Это не рекомендуется для производства, но вы можете импортировать будущее, если хотите:

      import { Temporal } from "proposal-temporal";

function temporalDateOnlyIso8601() {
  // yep, month is one-based here (as of Feb 2021)
  const plainDate = new Temporal.PlainDate(2014, 5, 11);
  const formatted = plainDate.toString();
  console.log("proposal-temporal", formatted);
}

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

Вы можете попробовать это: 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

Надеюсь, что это поможет вам!

Чтобы учесть часовой пояс, этот лайнер должен быть хорош без какой-либо библиотеки:

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

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

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

Вот один из способов сделать это:

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

Предупреждение: этот код не работает в некоторых версиях Chrome, Node.js и т. д.

  • Ожидал:yyyy-MM-dd
  • Действительный:M/d/yyyy

Рекомендации


Пожалуйста, учитывайте часовые пояса при конвертацииDateстрока даты.

Можно использовать два метода.

  • .toISOString();- Исправлено время GMT+0. Включает время, которое позже необходимо удалить.
  • .toLocaleDateString('en-CA');- Часовой пояс может быть указан. По умолчанию системный.

Обратите внимание, чтоen-CAэто локаль, а не часовой пояс. Канада используетYYYY-MM-DDформат.

В следующем примере системный часовой пояс установлен на PDT (GMT-7).

      const date = new Date('2023-04-08 GMT+09:00');
// Sat Apr 08 2023 00:00:00 GMT+0900 (한국 표준시)
// Fri Apr 07 2023 08:00:00 GMT-0700 (Pacific Daylight Time)

// Based on GMT+0 or UTC - time is substringed.
date.toISOString(); // '2023-04-07T15:00:00.000Z'
date.toISOString().substring(0, 10); // '2023-04-07'

// Based on GMT-7 - local timezone of the system
date.toLocaleDateString('en-CA'); // '2023-04-07'

// Based on GMT+9 - Asia/Seoul is GMT+9
date.toLocaleDateString('en-CA', { timeZone: 'Asia/Seoul' }); // '2023-04-08'

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

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

Вы можете использовать эту функцию для лучшего формата и простоты использования:

      function convert(date) {
    const d = Date.parse(date)
    const   date_obj = new Date(d)
    return `${date_obj.getFullYear()}-${date_obj.toLocaleString("default", { month: "2-digit" })}-${date_obj.toLocaleString("default", { day: "2-digit"})}`
}

Эта функция будет форматировать месяц как 2-значный вывод, а также дни

Ни один из этих ответов не удовлетворил меня. Я хотел кроссплатформенное решение, которое дает мне день в местном часовом поясе без использования каких-либо внешних библиотек.

Вот что я придумал:

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, чтобы он работал в IE8, но он должен поддерживаться везде.

Некоторые из них выше были в порядке - но не были очень гибкими. Я хотел что-то, что действительно могло бы справиться с большим количеством крайних случаев, поэтому я взял ответ @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.
  // 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');

Если вы используете momentjs, теперь они включают константу для этого формата YYYY-MM-DD:

date.format(moment.HTML5_FMT.DATE)
Другие вопросы по тегам