Перетворіть дату ISO у формат дати yyyy-mm-dd в JavaScript


109

Як я можу отримати дату у форматі yyyy-mm-dd від дати ISO 8601 ?

Моя дата 8601

2013-03-10T02:00:00Z

Як я можу отримати таке?

2013-03-10

2
Ви насправді намагалися це зробити? Це не нове запитання, на яке відповіли неодноразово.
bPratik


14
date.split("T")[0]зробив би
Аравінд Гопі

Відповіді:


100

Спробуйте це

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
Раві Деліксан

Це довше і більш схильне до друку в порівнянні з відповіддю DriveByPoster. Але я не дам оскарження, тому що це більш мовно-агностично. Він просто не використовує прості інструменти в нашому розпорядженні.
RoboticRenaissance

сер, будь ласка, скажіть, будь ласка, як передати 2013 3 1 цю форматну дату в новій Дата (дата)
Kapil soni

143

Просто обріжте рядок:

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 є локальним. Ви повинні взяти це до уваги.
Гійом Ф.

3
@GuillaumeF. Важливий розгляд, але він відповідає вимогам ОП
jamesjansson

Я не можу зрозуміти, чому рядок слід розбирати на Date. Варіант підрядки є найпростішою відповіддю.
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"

Хоча цей фрагмент коду може вирішити питання, зокрема пояснення дійсно допомагає покращити якість вашої публікації. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду. Будь ласка, намагайтеся не переповнювати свій код пояснювальними коментарями, оскільки це зменшує читабельність і коду, і пояснень!
Goodbye StackExchange

2
momentце досить величезна бібліотека, яку можна використовувати лише для форматування. Скоріше використовуйте date-fns, який значно менших розмірів і дає однакові функціональні можливості.
Хозефа

@Hozefa, тоді відповідь на питання ОП зі своїм рішенням.
Гарріс

1
@Harris - виконав роботу без проблем!
HadidAli

Я б хотів, щоб момент мав якусь функцію на кшталт .toISODateString(), тому що це дуже часті випадки ...
Лев Лукомський

12

Це те, що я роблю, щоб отримати тільки побачення:

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

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


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

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

9

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

Ця дата виведе у форматі РРРР-ММ-DD:

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 є невідповідним для всіх користувачів, тому цілком може не дати результату, необхідного ОП.
RobG

4

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

У рядку ISO є зулу-часовий пояс і дата відповідно до цього часового поясу, а значить, вона може використовувати дату за день до або пізніше фактичного часового поясу, який ви повинні враховувати у своєму ланцюжку перетворень.

Дивіться цей приклад:

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

Продовжити на гк гк «s рішення : У разі , якщо ви хочете , формат включає в себе час, ви можете додати toTimeString()в рядок, а потім забирається частина GMT, наступним чином :

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

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;

0

Краща версія відповіді від @Hozefa .

Якщо ви date-fnsвстановили, ви можете використовувати функцію formatISO

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.