Преобразование даты ISO в формат даты гггг-мм-дд в JavaScript


111

Как я могу получить дату в формате гггг-мм-дд из даты ISO 8601 ?

Моя дата 8601

2013-03-10T02:00:00Z

Как я могу получить следующее?

2013-03-10

2
Вы действительно пытались это сделать? Это не новый вопрос, на него неоднократно отвечали.
bPratik 06

1
возможный дубликат
раздела

14
date.split("T")[0]будет делать
Aravindh Gopi

Ответы:


102

Попробуй это

date = new Date('2013-03-10T02:00:00Z');
date.getFullYear()+'-' + (date.getMonth()+1) + '-'+date.getDate();//prints expected format.

Обновить:-

Как указано в комментариях, я обновляю ответ, чтобы при необходимости печатать ведущие нули для даты и месяца.

date = new Date('2013-08-03T02:00:00Z');
year = date.getFullYear();
month = date.getMonth()+1;
dt = date.getDate();

if (dt < 10) {
  dt = '0' + dt;
}
if (month < 10) {
  month = '0' + month;
}

console.log(year+'-' + month + '-'+dt);


17
Обратите внимание, я не думаю, что это будет выводить
начальный

2
Согласитесь с @ user3413723, это не отвечает на вопрос, потому что он удаляет ведущий 0, поэтому не соответствует требованиям формата YYYY-MM-DD
Джеймс Мерфи

Работает нормально @Mritunjay
Ravi Delixan

Это длиннее и более подвержено опечаткам по сравнению с ответом DriveByPoster. Но я не буду отрицать, потому что это больше не зависит от языка. Он просто не использует простые инструменты, имеющиеся в нашем распоряжении.
RoboticRenaissance 01

сэр, не могли бы вы рассказать мне, как передать 2013 3 1 дату в этом формате в новую дату (дату)
Капил сони

148

Просто обрежьте строку:

var date = new Date("2013-03-10T02:00:00Z");
date.toISOString().substring(0, 10);

Или, если вам нужна только дата вне строки.

var strDate = "2013-03-10T02:00:00Z";
strDate.substring(0, 10);

3
Я думаю, что это самое простое и элегантное решение из всех, но есть ли здесь какие-то недостатки?
Aida_Aida

30
@Aida_Aida Единственная проблема, о которой я могу думать, заключается в том, что если ваш код имеет дело со временем в геологическом масштабе не менее 8000 лет в будущем, ваш код может сломаться, потому что формат будет YYYYY-MM-DDв 10000 году. Чтобы избежать этого, вы можете разделить его на Tперсонаж вместо этого. (См en.wikipedia.org/wiki/Year_10,000_problem )
apsillers

9
Этот способ не будет правильно обрабатывать часовые пояса, поскольку ISOString - это UTC, а объект Date является локальным. Вы должны принять это во внимание.
Гийом Ф.

4
@GuillaumeF. важное соображение, но оно соответствует требованиям OP
jamesjansson

Я не могу понять, почему строку следует анализировать на дату. Вариант подстроки кажется самым простым ответом.
RobG


15

Moment.js выполнит форматирование даты за вас. Вот как включить его с помощью тега JavaScript, а затем пример того, как использовать Moment.js для форматирования даты.

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>

moment("2013-03-10T02:00:00Z").format("YYYY-MM-DD") // "2013-03-10"

Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода. Также постарайтесь не загромождать свой код пояснительными комментариями, так как это снижает удобочитаемость как кода, так и пояснений!
Прощай, StackExchange,

2
moment- довольно большая библиотека, которую можно использовать только для форматирования. Скорее используйте date-fns, который намного меньше по размеру и дает ту же функциональность.
Hozefa

@Hozefa, затем ответьте на вопрос OP своим решением.
Harris

1
@Harris - отлично справился!
HadidAli

Я бы хотел, чтобы у момента была какая-то функция .toISODateString(), потому что это очень частый случай ...
Лев Лукомский

13

Вот что я делаю только для свидания:

let isoDate = "2013-03-10T02:00:00Z";

alert(isoDate.split("T")[0]);


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

1
toISOString использует UTC, что приведет к неправильной локальной дате для периода смещения местного часового пояса от полуночи. - RobG
Майкл Диммитт

10

Moment.js - довольно большая библиотека для единственного варианта использования. Я рекомендую использовать date-fnsвместо этого. Он предлагает в основном большую часть функциональности Moment.js с гораздо меньшим размером пакета и многими другими formatting options.

import format from 'date-fns/format'
format('2013-03-10T02:00:00Z', 'YYYY-MM-DD'); // 2013-03-10, YYYY-MM-dd for 2.x

Следует отметить, что, поскольку это формат времени ISO 8601 , браузер обычно преобразует время в формате UTC в местный часовой пояс. Хотя это простой вариант использования, в котором вы, вероятно, можете сделать'2013-03-10T02:00:00Z'.substring(0, 10); .

Для более сложных преобразований date-fnsэто лучший способ.




4

Это выведет дату в формате ГГГГ-ММ-ДД:

let date = new Date();
date = date.toISOString().slice(0,10);

Я не знаю, почему это не набирает больше голосов, это сработало отлично, и ответил на вопрос с минимальными усилиями
Wolfiebae

4

Передайте дату в объекте даты:

var d = new Date('2013-03-10T02:00:00Z');
d.toLocaleDateString().replace(/\//g, '-');

1
toLocaleDateString () выдаст в формате "/". Не "-" формат.
TechCrunch

Вы можете использовать указанное выше с заменой «/» на «-». Не самый элегантный, хотя toLocaleDateString когда-либо менялся
Джеймс Мерфи

Результат toLocaleDateString не согласован для всех пользователей, поэтому вполне может не дать результата, требуемого OP.
RobG

4

Для всех, кто использует разбиение, срез и другие строковые попытки получить дату, вы можете настроить себя на ошибки, связанные с часовым поясом!

Строка ISO имеет Zulu-Timezone и дату в соответствии с этим часовым поясом, что означает, что она может использовать дату на день раньше или позже фактического часового пояса, который вы должны учитывать в своей цепочке преобразования.

См. Этот пример:

const timeZoneRelatedDate = new Date(2020, 0, 14, 0, 0);

console.log(timeZoneRelatedDate.toLocaleDateString(
    'ja-JP', 
    {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit'
    }
).replace(/\//gi,'-'));

// RESULT: "2020-01-14"

console.log(timeZoneRelatedDate.toISOString());

// RESULT: "2020-01-13T23:00:00.000Z" (for me in UTC+1)

console.log(timeZoneRelatedDate.toISOString().slice(0,10));

// RESULT: "2020-01-13"

3

Если у вас есть объект даты:

let date = new Date()
let result = date.toISOString().split`T`[0]

console.log(result)

или

let date = new Date()
let result = date.toISOString().slice(0, 10)

console.log(result)


1
toISOString использует UTC, что приведет к неправильной локальной дате для периода смещения местного часового пояса от полуночи.
RobG

1

Чтобы расширить решение rk rk : если вы хотите, чтобы формат включал время, вы можете добавить в toTimeString()свою строку, а затем удалить часть GMT следующим образом:

var d = new Date('2013-03-10T02:00:00Z');
var fd = d.toLocaleDateString() + ' ' + d.toTimeString().substring(0, d.toTimeString().indexOf("GMT"));

1

Лучшая версия ответа @Hozefa .

Если вы date-fnsустановили, вы можете использовать функцию formatISO

const date = new Date(2019, 0, 2)
import { formatISO } from 'date-fns'
formatISO(date, { representation: 'date' }) // '2019-01-02' string

0

Я использовал это:

HTMLDatetoIsoDate(htmlDate){
  let year = Number(htmlDate.toString().substring(0, 4))
  let month = Number(htmlDate.toString().substring(5, 7))
  let day = Number(htmlDate.toString().substring(8, 10))
  return new Date(year, month - 1, day)
}

isoDateToHtmlDate(isoDate){
  let date = new Date(isoDate);
  let dtString = ''
  let monthString = ''
  if (date.getDate() < 10) {
    dtString = '0' + date.getDate();
  } else {
    dtString = String(date.getDate())
  }
  if (date.getMonth()+1 < 10) {
    monthString = '0' + Number(date.getMonth()+1);
  } else {
    monthString = String(date.getMonth()+1);
  }
  return date.getFullYear()+'-' + monthString + '-'+dtString
}

Источник: http://gooplus.fr/en/2017/07/13/angular2-typescript-isodate-to-html-date/



0
let dt = new Date('2013-03-10T02:00:00Z');
let dd = dt.getDate();
let mm = dt.getMonth() + 1;
let yyyy = dt.getFullYear();

if (dd<10) {
    dd = '0' + dd;
}
if (mm<10) {
    mm = '0' + mm;
}
return yyyy + '-' + mm + '-' + dd;

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.