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.