Konwertuj datę ISO na format daty rrrr-mm-dd w JavaScript


109

Jak mogę uzyskać datę w formacie rrrr-mm-dd na podstawie daty ISO 8601 ?

Moja data 8601 to

2013-03-10T02:00:00Z

Jak mogę uzyskać następujące informacje?

2013-03-10

2
Czy faktycznie próbowałeś to zrobić? To nie jest nowe pytanie, na które udzielono wielu odpowiedzi.
— bPratik,


14
date.split("T")[0]zrobi
— Aravindh Gopi

Odpowiedzi:


100

Spróbuj tego

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

Aktualizacja:-

Jak wskazano w komentarzach, aktualizuję odpowiedź, aby w razie potrzeby wypisać zera wiodące dla daty i miesiąca.

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
Uwaga, nie sądzę, aby to
— wypisało

2
Zgadzam się z @ user3413723 to nie odpowiada na pytanie, ponieważ usuwa początkowe 0, dlatego nie spełnia wymagań formatu RRRR-MM-DD
— James Murphy

Działa dobrze @Mritunjay
— Ravi Delixan

To jest dłuższe i bardziej podatne na literówki w porównaniu z odpowiedzią DriveByPoster. Ale nie będę głosował przeciw, ponieważ jest bardziej niezależny od języka. Po prostu nie korzysta z prostych narzędzi, którymi dysponujemy.
— RoboticRenaissance

proszę pana, proszę mi powiedzieć, jak przejść 2013 3 1 ten format data w nowej dacie (data)
— Kapil soni

144

Po prostu przytnij ciąg:

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

Lub jeśli potrzebujesz tylko daty poza ciągiem.

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

3
Myślę, że jest to najłatwiejsze i najbardziej eleganckie rozwiązanie spośród nich wszystkich, ale czy jest to jakaś wada?
— Aida_Aida,

30
@Aida_Aida Jedynym problemem, jaki przychodzi mi do głowy, jest to, że jeśli twój kod zajmuje się czasem w skali geoloicznej co najmniej 8000 lat w przyszłości, twój kod może się zepsuć, ponieważ format będzie YYYYY-MM-DDw roku 10000. Aby tego uniknąć, możesz podzielić na Tznak zamiast. (Patrz en.wikipedia.org/wiki/Year_10,000_problem )
— apsillers

9
W ten sposób nie będzie poprawnie obsługiwać stref czasowych, ponieważ ISOString to UTC, ale obiekt Date jest lokalny. Musisz wziąć to pod uwagę.
— Guillaume F.

3
@GuillaumeF. ważna kwestia, ale spełnia wymagania OP
— jamesjansson

Nie mogę pojąć, dlaczego ciąg powinien zostać przetworzony na datę. Podciąg opcja wydaje się być najprostszym rozwiązaniem.
— RobG


15

Moment.js zajmie się formatowaniem daty za Ciebie. Oto, jak dołączyć go za pomocą tagu JavaScript, a następnie przykład użycia Moment.js do sformatowania daty.

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

Chociaż ten fragment kodu może rozwiązać problem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod. Prosimy również starać się nie zatłoczyć kodu komentarzami wyjaśniającymi, ponieważ zmniejsza to czytelność zarówno kodu, jak i wyjaśnień!
— Goodbye StackExchange

2
momentto całkiem spora biblioteka, której można używać tylko do formatowania. Zamiast tego używaj daty-fns, która jest znacznie mniejsza i zapewnia taką samą funkcjonalność.
— Hozefa

@Hozefa, a następnie odpowiedz na pytanie OP, podając swoje rozwiązanie.
— Harris,

1
@Harris - sprawnie wykonaliśmy pracę!
— HadidAli

Chciałbym, żeby chwila miała jakąś funkcję .toISODateString(), bo to bardzo częsty przypadek ...
— Lew Łukomski

12

Oto, co robię, aby uzyskać tylko datę:

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

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


2
Jest to pierwsza odpowiedź, która faktycznie proponuje pomysł split () jako odpowiedź, o ile mogę powiedzieć, i podoba mi się to rozwiązanie pod względem wysiłku, niezawodności vs czynnika efektywnego, chociaż używam momentu () wszędzie, gdzie tylko mogę.
— rainabba

1
toISOString używa czasu UTC, który wygeneruje nieprawidłową datę lokalną dla okresu przesunięcia lokalnej strefy czasowej od północy. - RobG
— Michael Dimmitt

9

Moment.js to dość duża biblioteka do pojedynczego wykorzystania. Polecam date-fnszamiast tego. Oferuje w zasadzie największą funkcjonalność Moment.js przy znacznie mniejszym rozmiarze pakietu i wielu plikach 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

Należy zauważyć, że ponieważ jest to format czasu ISO 8601 , przeglądarka zazwyczaj konwertuje czas UTC na lokalną strefę czasową. Chociaż jest to prosty przypadek użycia, w którym prawdopodobnie możesz to zrobić '2013-03-10T02:00:00Z'.substring(0, 10);.

W przypadku bardziej złożonych konwersji date-fnsjest to droga.


6

let isoDate = "2013-03-10T02:00:00Z";
var d = new Date(isoDate);
d.toLocaleDateString('en-GB'); // dd/mm/yyyy
d.toLocaleDateString('en-US'); // mm/dd/yyyy


d.toLocaleDateString ('en-GB'); działa jak marzenie. Świetna odpowiedź!
— Donald Shahini

5

Posługiwać się:

new Date().toISOString().substring(0, 10);

4

Spowoduje to wyświetlenie daty w formacie RRRR-MM-DD:

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

Nie wiem, dlaczego nie ma większej liczby głosów, zadziałało idealnie i odpowiedziałem na pytanie przy minimalnym wysiłku
— Wolfiebae

4

Podaj datę w obiekcie daty:

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

1
toLocaleDateString () poda w formacie „/”. Nie w formacie „-”.
— TechCrunch

Możesz użyć powyższego zamieniając „/” na „-”. Nie jest to najbardziej eleganckie, jeśli toLocaleDateString kiedykolwiek się zmieni
— James Murphy

Wynik metody toLocaleDateString nie jest spójny dla wszystkich użytkowników, więc może nie dać wyniku wymaganego przez OP.
— RobG

4

Dla wszystkich, którzy używają dzielenia, wycinania i innych prób uzyskania daty opartych na ciągach, możesz ustawić się na niepowodzenia związane ze strefą czasową!

Ciąg ISO ma strefę czasową Zulu i datę zgodną z tą strefą czasową, co oznacza, że ​​może używać daty dzień wcześniej lub później niż rzeczywista strefa czasowa, którą musisz wziąć pod uwagę w swoim łańcuchu transformacji.

Zobacz ten przykład:

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

Jeśli masz obiekt daty:

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

console.log(result)

lub

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

console.log(result)


1
toISOString używa czasu UTC, który wygeneruje nieprawidłową datę lokalną dla okresu przesunięcia lokalnej strefy czasowej od północy.
— RobG,

1

Aby przedłużyć na rk rk „s rozwiązanie : W przypadku, gdy chcesz format zawierać czas, można dodać toTimeString()do łańcucha, a następnie rozebrać część GMT, co następuje:

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

0

Użyłem tego:

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
}

Źródło: 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

Lepsza wersja odpowiedzi autorstwa @Hozefa .

Jeśli date-fnszainstalowałeś, możesz użyć funkcji formatISO

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

-4

Użyj poniższego kodu. To jest dla ciebie przydatne.

let currentDate = new Date()
currentDate.toISOString()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.