Czy pobrać ciąg w formacie RRRRMMDD z obiektu daty JS?

398

Próbuję użyć JS, aby przekształcić date objectłańcuch znaków w YYYYMMDDformat. Czy istnieje prostszy sposób niż łączenie Date.getYear(), Date.getMonth()i Date.getDay()?

IVR Avenger
źródło
4
Łączenie tych trzech jest właściwą drogą
Juan Cortés
5
jeśli chcesz ciąg, który będzie analizować do tej samej daty, nie zapomnij o zwiększeniu miesiąca. Aby dopasować specyfikację, musisz również
wpisać

Odpowiedzi:

621

Zmieniony fragment kodu, którego często używam:

Date.prototype.yyyymmdd = function() {
  var mm = this.getMonth() + 1; // getMonth() is zero-based
  var dd = this.getDate();

  return [this.getFullYear(),
          (mm>9 ? '' : '0') + mm,
          (dd>9 ? '' : '0') + dd
         ].join('');
};

var date = new Date();
date.yyyymmdd();
z oo
źródło
16
Należy wymienić [1]z .length===2, ponieważ indekser na sznurku nie jest w pełni obsługiwana. Zobacz tę odpowiedź z powodów, dla których.
Aidiakapi
6
var mm = (this.getMonth () + 101) .toStrung (). substring (0, 2);
9dan
7
Dla każdego, kto chce praktycznego przykładu poprawki @Aidiakapi, tworzę skrzypce tutaj: jsfiddle.net/pcr8xbt5/1
killercowuk 24.08.16
1
Jeśli chcesz mieć separator kropek:[this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
Kamil Kiełczewski
3
@ 9dan nie powinno byćvar mm = (this.getMonth() + 101).toString().substring(1, 3)
Pnar Sbi Wer
317

Nie podobało mi się dodawanie do prototypu. Alternatywą byłoby:

var rightNow = new Date();
var res = rightNow.toISOString().slice(0,10).replace(/-/g,"");

<!-- Next line is for code snippet output only -->
document.body.innerHTML += res;

Pierre Guilbert
źródło
51
Jeśli nie będziesz potrzebować rightNowzmiennej, możesz ją owinąć new Datei odzyskać w jednym wierszu:(new Date()).toISOString().slice(0,10).replace(/-/g,"")
BigBlueHat 26.09.13
5
Chciałam YYYYMMDDHHmmSSsss, więc zrobiłem to: var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. Całkiem proste, ale należy je zamknąć.
Jess,
65
Nie będzie to ogólnie działać, ponieważ Date.toISOString () tworzy datę w formacie UTC, a zatem może przesuwać granice dat w zależności od strefy czasowej. Np. W GMT + 1: (nowa data (2013,13, 25)). ToISOString () == '2013-12-24T23: 00: 00.000Z'
weberste, 12.12.2013
26
To się nie powiedzie, jeśli ktoś w roku 10000 użyje twojego „nostalgicznego” kodu.
Trevi Awater,
9
Sugerowana poprawa w zakresie stref czasowych. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Andreas
182

Możesz użyć toISOStringfunkcji:

var today = new Date();
today.toISOString().substring(0, 10);

Da ci format „rrrr-mm-dd”.

Ramzi SAYAGH
źródło
24
W niektórych przypadkach nie będzie to odpowiedni dzień, ze względu na strefę czasową światła dziennego itp.
Miguel
1
Może moja kreatywność jest zepsuta @Miguel, ale nie mogę wymyślić przypadku, w którym by się to wydarzyło. Czy mógłbyś podać przykład?
Cloudworks
35
Jeśli znajdujesz się w strefie czasowej +1 i masz datę [2015-09-01 00:00:00 GMT + 1], wówczas metoda toISOString () zwróci ciąg „2015-08-31T23: 00: 00.000Z „ponieważ data jest konwertowana na przesunięcie UTC / 0 przed zszeregowaniem.
Luke Baulch,
Nieco krótszy ... var dzisiaj = (new Date ()). ToISOString (). Substring (0, 10);
teawithfruit
Nie działa z innym GMT
Tobia
132

Moment.js może być twoim przyjacielem

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');
H6
źródło
18
No to dodałem 40kb (zminimalizowane, bez gZip) do mojej app.js, ale poszedłem po to, dzięki :).
Bart
najlepsza jak dotąd odpowiedź!
TrulyXax,
9
Nawet nie zawracam sobie głowy czekaniem, aż nieuchronnie potrzebuję chwili, po prostu dodaję ją na początku projektu :)
martinedwards
1
Możesz to ułatwić:var formattedDate = moment().format('YYYYMMDD');
ns16
37

Jeśli nie potrzebujesz czystego rozwiązania JS, możesz użyć interfejsu użytkownika jQuery, aby wykonać następujące zadanie:

$.datepicker.formatDate('yymmdd', new Date());

Zwykle nie lubię importować zbyt wielu bibliotek. Ale interfejs jQuery jest tak przydatny, że prawdopodobnie użyjesz go gdzie indziej w swoim projekcie.

Odwiedź http://api.jqueryui.com/datepicker/, aby uzyskać więcej przykładów

NLemay
źródło
37

Jest to pojedynczy wiersz kodu, którego można użyć do utworzenia YYYY-MM-DDciągu dzisiejszej daty.

var d = new Date().toISOString().slice(0,10);
Brian Powell
źródło
^ to! FTW! +1 .. trzeba jednak trochę przetestować.
Gogol,
21
Ostrzeżenie trudne, jeśli twoja data to 2016-01-01 00:00:00 GMT +2, zwróci 31.12.2015, ponieważ toISOString()da 2015-12-31T22: 00: 00 GMT +0 (dwie godziny wcześniej).
Jérôme Gillard
29
new Date('Jun 5 2016').
  toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).
  replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');

// => '2016-06-05'
gongqj
źródło
5
Najlepsza dusza.
زياد
Z jakiegoś powodu musiałem dodać czas (nawet jeśli 00:00) na konwersję, aby nie pomijać dnia wstecz, kiedy uruchamiam formułę tutaj, wschodnie wybrzeże USA. Gdy to zrobiłem, zaczęło działać niezawodnie. Uwielbiam to, że może przyjmować datę wejścia w wielu formatach, więc nie muszę się już o to martwić. new Date('Sun Mar 31 2019 00:00:00.000').toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');
nenea
24

Oprócz odpowiedzi oo chciałbym zalecić oddzielenie operacji logicznych od znaku powrotu i umieszczenie ich w postaci trójek w zmiennych.

Użyj również, concat()aby zapewnić bezpieczne łączenie zmiennych

Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear();
  var mm = this.getMonth() < 9 ? "0" + (this.getMonth() + 1) : (this.getMonth() + 1); // getMonth() is zero-based
  var dd = this.getDate() < 10 ? "0" + this.getDate() : this.getDate();
  return "".concat(yyyy).concat(mm).concat(dd);
};

Date.prototype.yyyymmddhhmm = function() {
  var yyyymmdd = this.yyyymmdd();
  var hh = this.getHours() < 10 ? "0" + this.getHours() : this.getHours();
  var min = this.getMinutes() < 10 ? "0" + this.getMinutes() : this.getMinutes();
  return "".concat(yyyymmdd).concat(hh).concat(min);
};

Date.prototype.yyyymmddhhmmss = function() {
  var yyyymmddhhmm = this.yyyymmddhhmm();
  var ss = this.getSeconds() < 10 ? "0" + this.getSeconds() : this.getSeconds();
  return "".concat(yyyymmddhhmm).concat(ss);
};

var d = new Date();
document.getElementById("a").innerHTML = d.yyyymmdd();
document.getElementById("b").innerHTML = d.yyyymmddhhmm();
document.getElementById("c").innerHTML = d.yyyymmddhhmmss();
<div>
  yyyymmdd: <span id="a"></span>
</div>
<div>
  yyyymmddhhmm: <span id="b"></span>
</div>
<div>
  yyyymmddhhmmss: <span id="c"></span>
</div>

Eric Herlitz
źródło
Jeśli ktoś lubi tego używać, sugeruję tutaj OSUSZANIE, ponownie użyj już utworzonych funkcji zamiast robić to samo od nowa.
RiZKiT
@RiZKiT DRY jest zasadą, a nie wzorem, ale na pewno można to znacznie poprawić. Gdybym sam tego użył, prawdopodobnie użyłbym innego wzorca i odsunąłbym metody od prototypu. Napisałem głównie przykład, aby pokazać, gdzie są inne sposoby rozwiązania problemu. To, co ludzie biorą stamtąd, zależy od nich samych
Eric Herlitz
Miły! Używam ("00" + (this.getDate())).slice(-2)liczb dwucyfrowych. Nie ma instrukcji „if” ani „?:”, A mniej wywołań funkcji .getX (). Jeśli nie jest trochę szybszy, jest co najmniej bardziej czytelny.
le hollandais volant
22

Nie lubię modyfikować rodzimych obiektów i myślę, że mnożenie jest wyraźniejsze niż wypełnianie łańcucha akceptowanym rozwiązaniem.

function yyyymmdd(dateIn) {
  var yyyy = dateIn.getFullYear();
  var mm = dateIn.getMonth() + 1; // getMonth() is zero-based
  var dd = dateIn.getDate();
  return String(10000 * yyyy + 100 * mm + dd); // Leading zeros for mm and dd
}

var today = new Date();
console.log(yyyymmdd(today));

Fiddle: http://jsfiddle.net/gbdarren/Ew7Y4/

Darren Griffith
źródło
4
Ta odpowiedź została odrzucona i nie wiem dlaczego. Czułem, że matematyka jest szybsza i bardziej zrozumiała niż manipulacja sznurkiem. Jeśli ktoś wie, dlaczego jest to zła odpowiedź, daj mi znać.
Darren Griffith,
4
Multiplikator 10000 ma przesunąć w lewo YYYY o 4 miejsca (cyfry miesiąca i dnia wymagają 2 cyfr każda) i nie ma nic wspólnego z błędem Y10K. Podoba mi się ta odpowiedź i zasługuję na szacunek!
A. Masson,
1
Dzięki za tę odpowiedź stworzyłem skrzypce tutaj jsfiddle.net/amwebexpert/L6j0omb4
A. Masson
1
W ogóle nie potrzebowałem mnożenia i nie rozumiem, dlaczego tak jest. jsfiddle.net/navyjax2/gbqmv0t5 W przeciwnym razie, pomiń to, a to jest świetna odpowiedź i bardzo mi pomogła.
vapcguy,
1
@ D-Money Ach, zrozumiałem, co masz na myśli - robisz konkatenację innego rodzaju, dodając liczby razem, aby uniknąć wykonywania przez nich innej operacji matematycznej na sobie - operacji, która uniemożliwia normalną, która „ inaczej je pomieszaliśmy. Dobra robota! Mój działa, ponieważ używam separatorów (które musiałbym zrobić, .replace('-', '')aby odpowiedzieć na pytanie PO), podczas gdy ty byłeś wierny oryginalnemu pytaniu PO i nie wymagałoby to dodatkowego kroku. Świetny!
vapcguy,
15

Proste rozwiązanie JS (ES5) bez problemów z przeskokiem daty spowodowanych drukowaniem Date.toISOString () w UTC:

var now = new Date();
var todayUTC = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));
return todayUTC.toISOString().slice(0, 10).replace(/-/g, '');

To w odpowiedzi na komentarz @ weberste do odpowiedzi @Pierre Guilbert.

Koszatka
źródło
now.getMonth () zwróci 0 za styczeń, powinno być (now.getMonth () + 1)
Jas
2
Źle. Funkcja UTC daty oczekuje, że miesiąc będzie między 0 a 11 (ale inne <0 i> 11 są dozwolone).
Dormouse
Dlaczego zastępujesz wiele łączników jednym? Czy może toISOStringzwrócić wiele kolejnych łączników?
Michaël Witrant
Michael - zastępuje każdy znaleziony łącznik pojedynczym łącznikiem. Nadal nie wiem, dlaczego (być może ciąg zastępujący jest po prostu miejscem na separator). „G” oznacza wszystkie wystąpienia. Wzór, o którym myślisz to / [-] + / g
Gerard ONeill,
2
Zrobiłeś mi dzień. Od wielu dni szukam prostego sposobu na ominięcie okropnej obsługi TimeZone w Javascript, a to załatwia sprawę!
Guillaume F.,
10

// UTC/GMT 0
document.write('UTC/GMT 0: ' + (new Date()).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812013509

// Client local time
document.write('<br/>Local time: ' + (new Date(Date.now()-(new Date()).getTimezoneOffset() * 60000)).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812113509

Kus
źródło
Oto odpowiedź, której użyłem. Jedna wkładka uwzględniająca strefę czasową. Aby odpowiedzieć na pytanie pierwotnego plakatu, moglibyśmy zrobić: (nowa data (Date.now () - (nowa data ()). GetTimezoneOffset () * 60000)). ToISOString (). Replace (/ [^ 0-9] / g, „”). slice (0,8)
tomwoods
thx, aby uzyskać RRRR-MM-DD, użyłem: nowej daty (Date.now () - (new Date ()). getTimezoneOffset () * 60000) .toISOString (). slice (0, 10) .replace (/ [ ^ 0-9] / g, „-”)
Nick Humphrey
7

var someDate = new Date();
var dateFormated = someDate.toISOString().substr(0,10);

console.log(dateFormated);

Tomas Šivickas
źródło
Bardzo mądry. Dziękuję
JMaylin,
4
Nie będzie działać, ponieważ nowa data () ma strefę czasową, a Date.toISOString () to UTC. Zobacz moją odpowiedź.
Dormouse
@ Domówka nie jest na odwrót? new Date()tworzy nowy obiekt daty, który jest tylko opakowaniem wokół nr. ms od 1970/01/01 00: 00: 00.000 UTC. Następnie toISOStringdrukuje w lokalnej strefie czasowej.
Stijn de Witt
Nie, Date.toISOString () drukuje w UTC.
Dormouse
7

Innym sposobem jest użycie toLocaleDateStringz ustawieniami regionalnymi, które mają standard formatu daty big-endian , takich jak Szwecja, Litwa, Węgry, Korea Południowa ...:

date.toLocaleDateString('se')

Aby usunąć ograniczniki ( -), wystarczy zastąpić cyfry:

console.log( new Date().toLocaleDateString('se').replace(/\D/g, '') );

Nie ma to potencjalnego błędu, jaki można uzyskać przy formatach dat UTC: data UTC może być o jeden dzień wolna w porównaniu z datą w lokalnej strefie czasowej.

trincot
źródło
6

Możesz po prostu użyć tego kodu jednego wiersza, aby uzyskać datę w roku

var date = new Date().getFullYear() + "-" + (parseInt(new Date().getMonth()) + 1) + "-" + new Date().getDate();
Muhammad Ahsan
źródło
5

Trochę uproszczona wersja najpopularniejszej odpowiedzi w tym wątku https://stackoverflow.com/a/3067896/5437379 :

function toYYYYMMDD(d) {
    var yyyy = d.getFullYear().toString();
    var mm = (d.getMonth() + 101).toString().slice(-2);
    var dd = (d.getDate() + 100).toString().slice(-2);
    return yyyy + mm + dd;
}
Hero Qu
źródło
5

dateformat to bardzo używany pakiet.

Jak używać:

Pobierz i zainstaluj dateformatz NPM. Wymagaj tego w swoim module:

const dateFormat = require('dateformat');

a następnie po prostu sformatuj swoje rzeczy:

const myYYYYmmddDate = dateformat(new Date(), 'yyyy-mm-dd');

Milkncookiez
źródło
4

Ten facet tutaj => http://blog.stevenlevithan.com/archives/date-time-format napisał format()funkcję dla Dateobiektu Javascript , więc można go używać ze znanymi formatami literalnymi.

Jeśli potrzebujesz w pełni funkcjonalnego formatowania daty w JavaScript aplikacji, użyj go. W przeciwnym razie, jeśli to, co chcesz zrobić, jest jednorazowe, to połączenie getYear (), getMonth (), getDay () jest prawdopodobnie najłatwiejsze.

Strelok
źródło
4

Praca z odpowiedzią @ oo zwróci ciąg daty zgodnie z ciągiem formatu. Możesz łatwo dodać 2-cyfrowy regex roku na rok i milisekundy i taki, jeśli ich potrzebujesz.

Date.prototype.getFromFormat = function(format) {
    var yyyy = this.getFullYear().toString();
    format = format.replace(/yyyy/g, yyyy)
    var mm = (this.getMonth()+1).toString(); 
    format = format.replace(/mm/g, (mm[1]?mm:"0"+mm[0]));
    var dd  = this.getDate().toString();
    format = format.replace(/dd/g, (dd[1]?dd:"0"+dd[0]));
    var hh = this.getHours().toString();
    format = format.replace(/hh/g, (hh[1]?hh:"0"+hh[0]));
    var ii = this.getMinutes().toString();
    format = format.replace(/ii/g, (ii[1]?ii:"0"+ii[0]));
    var ss  = this.getSeconds().toString();
    format = format.replace(/ss/g, (ss[1]?ss:"0"+ss[0]));
    return format;
};

d = new Date();
var date = d.getFromFormat('yyyy-mm-dd hh:ii:ss');
alert(date);

Nie wiem jednak, jak to jest wydajne, szczególnie perfekcyjnie, ponieważ wykorzystuje wiele wyrażeń regularnych. Prawdopodobnie przydałby się trochę pracy, której nie opanowałem czystego js.

Tom Tom
źródło
4

Ten kod jest poprawiony w odpowiedzi Pierre'a Guilberta:

(działa nawet po 10000 latach)

YYYYMMDD=new Date().toISOString().slice(0,new Date().toISOString().indexOf("T")).replace(/-/g,"")
anmml
źródło
3

Zwykle używam poniższego kodu, gdy muszę to zrobić.

var date = new Date($.now());
var dateString = (date.getFullYear() + '-'
    + ('0' + (date.getMonth() + 1)).slice(-2)
    + '-' + ('0' + (date.getDate())).slice(-2));
console.log(dateString); //Will print "2015-09-18" when this comment was written

Aby to wyjaśnić, .slice (-2) podaje nam dwa ostatnie znaki ciągu.

Bez względu na wszystko, możemy dodać „0” do dnia lub miesiąca i po prostu poprosić o dwa ostatnie, ponieważ zawsze są to dwa, których chcemy.

Jeśli więc MyDate.getMonth () zwróci 9, będzie to:

("0" + "9") // Giving us "09"

więc dodanie .slice (-2) daje nam ostatnie dwa znaki, które są:

("0" + "9").slice(-2)

"09"

Ale jeśli date.getMonth () zwróci 10, będzie to:

("0" + "10") // Giving us "010"

więc dodanie .slice (-2) daje nam dwa ostatnie znaki lub:

("0" + "10").slice(-2)

"10"
Ogglas
źródło
3

Jeśli używasz AngularJs (do 1.5), możesz użyć filtra daty :

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')
sarin
źródło
3

Odpowiadając innym za prostotę i czytelność.
Ponadto nie zaleca się edytowania istniejących predefiniowanych elementów klasy za pomocą nowych metod:

function getDateInYYYYMMDD() {
    let currentDate = new Date();

    // year
    let yyyy = '' + currentDate.getFullYear();

    // month
    let mm = ('0' + (currentDate.getMonth() + 1));  // prepend 0 // +1 is because Jan is 0
    mm = mm.substr(mm.length - 2);                  // take last 2 chars

    // day
    let dd = ('0' + currentDate.getDate());         // prepend 0
    dd = dd.substr(dd.length - 2);                  // take last 2 chars

    return yyyy + "" + mm + "" + dd;
}

var currentDateYYYYMMDD = getDateInYYYYMMDD();
console.log('currentDateYYYYMMDD: ' + currentDateYYYYMMDD);
Manohar Reddy Poreddy
źródło
2

Jeśli nie masz nic przeciwko dołączeniu dodatkowej (ale małej) biblioteki, Sugar.js zapewnia wiele fajnych funkcji do pracy z datami w JavaScript. Aby sformatować datę, użyj funkcji formatowania :

new Date().format("{yyyy}{MM}{dd}")
Andersh
źródło
2

yyyymmdd=x=>(f=x=>(x<10&&'0')+x,x.getFullYear()+f(x.getMonth()+1)+f(x.getDate()));
alert(yyyymmdd(new Date));

Enam
źródło
1
dodanie opisu do odpowiedzi sprawi, że będziesz pozytywnie oceniać, co robisz w tym kodzie, aby inni mogli go lepiej zrozumieć.
Muhammad Omer Aslam
W trybie ścisłym lub pisma maszynowego użyj zamiast tego „let f, rrrrmmdd = x => ...”. Funkcje yyyymmdd i f są poza tym niezdefiniowane.
Max
2

data-shortcode na ratunek!

const dateShortcode = require('date-shortcode')
dateShortcode.parse('{YYYYMMDD}', new Date())
//=> '20180304'
Kodie Grantham
źródło
2

Użyj padStart :

Date.prototype.yyyymmdd = function() {
    return [
        this.getFullYear(),
        (this.getMonth()+1).toString().padStart(2, '0'), // getMonth() is zero-based
        this.getDate().toString().padStart(2, '0')
    ].join('-');
};
yajuliv
źródło
1

Oto bardziej ogólne podejście, które pozwala zarówno na komponenty daty, jak i godziny , i jest identycznie sortowalne jako liczba lub ciąg.

Na podstawie kolejności numerów w formacie Data ISO przekonwertuj na lokalną strefę czasową i usuń cyfry. to znaczy:

// monkey patch version
Date.prototype.IsoNum = function (n) {
    var tzoffset = this.getTimezoneOffset() * 60000; //offset in milliseconds
    var localISOTime = (new Date(this - tzoffset)).toISOString().slice(0,-1);
    return localISOTime.replace(/[-T:\.Z]/g, '').substring(0,n || 20); // YYYYMMDD
}

Stosowanie

var d = new Date();
// Tue Jul 28 2015 15:02:53 GMT+0200 (W. Europe Daylight Time)
console.log(d.IsoNum(8));  // "20150728"
console.log(d.IsoNum(12)); // "201507281502"
console.log(d.IsoNum());   // "20150728150253272"
chriskelly
źródło
1

Natywny JavaScript:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');
Lonnie Best
źródło
1
To nie uzupełnia miesięcy wartością 0, aby zapewnić, że miesiąc będzie składał się z 2 cyfr.
Attila Szeremi
Masz rację. Później to zauważyłem. Musisz ostrożnie testować formatowanie daty w dwucyfrowych miesiącach i dniach.
Lonnie Best