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
neeraj
źródło
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);

Mritunjay
źródło
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);
DriveByPoster
źródło
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"
Harris
źródło
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]);

Aravindh Gopi
źródło
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.

Hozefa
źródło
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

Ammar H Alshaar
źródło
d.toLocaleDateString ('en-GB'); działa jak marzenie. Świetna odpowiedź!
Donald Shahini
5

Posługiwać się:

new Date().toISOString().substring(0, 10);
Ankita
źródło
4

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

let date = new Date();
date = date.toISOString().slice(0,10);
sebhs
źródło
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, '-');
rk rk
źródło
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"
Jook
źródło
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)

Илья Зеленько
źródło
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"));
Airwavezx
źródło
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/

Alan
źródło
0

    var d = new Date("Wed Mar 25 2015 05:30:00 GMT+0530 (India Standard Time)");
    alert(d.toLocaleDateString());

Abilash Raghu
źródło
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;
Wyciek pamięci
źródło
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
asiniy
źródło
-4

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

let currentDate = new Date()
currentDate.toISOString()
Mohammad Bilal
źródło