Do tej pory JavaScript dodaje wiodące zera

437

Stworzyłem ten skrypt, aby obliczyć datę z 10-dniowym wyprzedzeniem w formacie dd / mm / rrrr:

var MyDate = new Date();
var MyDateString = new Date();
MyDate.setDate(MyDate.getDate()+10);
MyDateString = MyDate.getDate() + '/' + (MyDate.getMonth()+1) + '/' + MyDate.getFullYear();

Potrzebuję, aby data pojawiła się z zerami wiodącymi w komponencie dnia i miesiąca, poprzez dodanie tych reguł do skryptu. Nie mogę sprawić, żeby zadziałało.

if (MyDate.getMonth < 10)getMonth = '0' + getMonth;

i

if (MyDate.getDate <10)get.Date = '0' + getDate;

Gdyby ktoś mógł mi pokazać, gdzie wstawić je do skryptu, byłbym bardzo wdzięczny.

Julian Coates
źródło
6
Jako dobrą konwencję powinieneś pisać małe litery pierwszego znaku w nazwach zmiennych i rezerwować obudowę wielbłąda na obiekty / prototypy.
zykadelic
Jeśli format RRRR-MM-DD jest akceptowalny, byłaby to bardzo dobra odpowiedź: stackoverflow.com/a/28431880/1717535
Fabien Snauwaert

Odpowiedzi:

1352

Spróbuj tego: http://jsfiddle.net/xA5B7/

var MyDate = new Date();
var MyDateString;

MyDate.setDate(MyDate.getDate() + 20);

MyDateString = ('0' + MyDate.getDate()).slice(-2) + '/'
             + ('0' + (MyDate.getMonth()+1)).slice(-2) + '/'
             + MyDate.getFullYear();

EDYTOWAĆ:

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.

Więc jeśli MyDate.getMonth()zwroty 9będą:

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

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

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

Ale jeśli MyDate.getMonth()powró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"
użytkownik113716
źródło
27
Rozwidlony - format daty RRRR-MM-DD jsfiddle.net/j6qJp/1 Może to być przydatne dla kogoś. Dzięki
tomexx,
3
Czy ktoś może wyjaśnić, dlaczego jest to lepsze niż odpowiedź podana poniżej przez @Aleross? Nie jest od razu jasne, co robi w porównaniu z funkcją padu, która jest wyraźnie wyraźna.
claudio
2
Nie wspominając już o tym, że dzisiaj ten przykład dał mi 26.06.2014 zamiast 06.06.2014
DazManCat
3
@DazManCat: Tak właśnie powinno być. Kod zaczyna się od dodania 20 dni do bieżącej daty. MyDate.setDate(MyDate.getDate() + 20);
ciasteczkowy potwór
3
@ n00b i @Pilil Cooper, nie odrywając się od dyskusji na temat tajników rutynowych procedur JavaScript, stwierdziłem, że slice()technika w zaakceptowanej odpowiedzi jest o 1/10 sekundy szybsza niż technika @Aleross pad()na 1 milion iteracji. jsFiddle . „zapłać pieniądze, wybierz coś”.
Karl
105

Oto przykład z dokumentacji obiektu Date w sieci Mozilla Developer Network przy użyciu niestandardowej funkcji „pad”, bez konieczności rozszerzania prototypu JavaScript w języku Number. Przydatną funkcją, którą dają jako przykład, jest

function pad(n){return n<10 ? '0'+n : n}

A poniżej jest używany w kontekście.

/* use a function for the exact format desired... */
function ISODateString(d){
    function pad(n){return n<10 ? '0'+n : n}
    return d.getUTCFullYear()+'-'
    + pad(d.getUTCMonth()+1)+'-'
    + pad(d.getUTCDate())+'T'
    + pad(d.getUTCHours())+':'
    + pad(d.getUTCMinutes())+':'
    + pad(d.getUTCSeconds())+'Z'
}

var d = new Date();
console.log(ISODateString(d)); // prints something like 2009-09-28T19:03:12Z
Alex Ross
źródło
3
Bardzo fajny sposób na zrobienie tego. Myślę, że zaakceptowana odpowiedź jest naprawdę fajna, ale moim zdaniem jest jeszcze czystsza
Binke
1
może to prowadzić do nieoczekiwanych błędów, ponieważ wyświetla ciąg znaków dla <10 i liczbę dla> = 10
David Fregoli
@DavidFregoli, wszystkie te funkcje od daty do łańcucha zwracają ciąg, więc jeśli wprowadzisz ciąg, padwyprowadza tylko ciągi.
Rohmer,
56

Nowym nowoczesnym sposobem na to jest użycie toLocaleDateString, ponieważ nie tylko pozwala on sformatować datę z odpowiednią lokalizacją, ale nawet przekazać opcje formatowania, aby zarchiwizować pożądany wynik:

var date = new Date(2018, 2, 1);
var result = date.toLocaleDateString("en-GB", { // you can skip the first argument
  year: "numeric",
  month: "2-digit",
  day: "2-digit",
});
console.log(result);

Pominięcie pierwszego argumentu spowoduje wykrycie języka przeglądarki. Możesz też użyć opcji 2-digitna rok.

Jeśli nie potrzebujesz obsługiwać starych przeglądarek, takich jak IE10, jest to najczystszy sposób na wykonanie zadania. IE10 i niższe wersje nie zrozumieją argumentu opcji.

Uwaga: Ponadto istnieje możliwość toLocaleTimeString, jeśli chcesz zlokalizować lub sformatować godzinę daty.

Martin Braun
źródło
3
Właśnie tego szukałem, dzięki. Więcej informacji o opcjach dostępnych dla toLocaleDateString tutaj: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JoseLinares
1
@JoseLinares Cześć, dzięki za przywrócenie tego linku w ciągu ostatnich dni. Właśnie postanowiłem poprawić swoją odpowiedź, aby rozwiązanie było bardziej atrakcyjne dla typowych scenariuszy, ponieważ można pominąć pierwszy argument, a IE10 nie jest już istotny. Mając to na uwadze, dołączyłem twój link do mojej odpowiedzi.
Martin Braun,
@modiX, przepraszam, to był mój błąd w kodzie i źle podjąłem opis, tak ustawienia narodowe (pierwsza zmienna) są opcjonalne .
Kanhaiya lal
@Kanhaiyalal Nie martw się, błędy mogą się zdarzyć. Byłem tylko zaskoczony, że 2 z 3 recenzentów również zaakceptowało niewłaściwą edycję.
Martin Braun
51

Możesz zdefiniować funkcję „str_pad” (jak w php):

function str_pad(n) {
    return String("00" + n).slice(-2);
}
joan16v
źródło
9
Wystarczy „0” zamiast „00”
David Fregoli
Jak dotąd najlepsza odpowiedź.
Lucas Andrade
30

Dla was, ludzie z przyszłości (ECMAScript 2017 i nie tylko)

Rozwiązanie

"use strict"

const today = new Date()

const year = today.getFullYear()

const month = `${today.getMonth() + 1}`.padStart(2, "0")

const day = `${today.getDate()}`.padStart(2, "0")

const stringDate = [day, month, year].join("/") // 13/12/2017

Wyjaśnienie

String.prototype.padStart(targetLength[, padString])dodaje jak najwięcej padStringw String.prototypecelu tak, że nowa długość tarczy jest targetLength.

Przykład

"use strict"

let month = "9"

month = month.padStart(2, "0") // "09"

let byte = "00000100"

byte = byte.padStart(8, "0") // "00000100"
Amin NAIRI
źródło
4
Jest to część ES2017 lub ES8. Dlatego błędnie jest mówić „ES6 +”, ponieważ nie jest to część ES6 i ES7.
Noel Llevares
1
Technicznie powinno tak być, .padStart(2, '0')ponieważ drugi parametr jest łańcuchem, choć prawdopodobnie nie będzie to miało znaczenia, chyba że użyjesz TypeScript
bmaupin
Masz rację, zmienię moją odpowiedź.
Amin NAIRI
11
Number.prototype.padZero= function(len){
 var s= String(this), c= '0';
 len= len || 2;
 while(s.length < len) s= c + s;
 return s;
}

//w użyciu:

(function(){
 var myDate= new Date(), myDateString;
 myDate.setDate(myDate.getDate()+10);

 myDateString= [myDate.getDate().padZero(),
 (myDate.getMonth()+1).padZero(),
 myDate.getFullYear()].join('/');

 alert(myDateString);
})()

/*  value: (String)
09/09/2010
*/
Kennebec
źródło
10

Znalazłem najkrótszy sposób, aby to zrobić:

 MyDateString.replace(/(^|\D)(\d)(?!\d)/g, '$10$2');

doda wiodące zera do wszystkich samotnych, pojedynczych cyfr

Povesma Dmytro
źródło
Podoba mi się to rozwiązanie, czy możesz trochę wyjaśnić, co się tam dzieje?
Gobliins,
7
var MyDate = new Date();
var MyDateString = '';
MyDate.setDate(MyDate.getDate());
var tempoMonth = (MyDate.getMonth()+1);
var tempoDate = (MyDate.getDate());
if (tempoMonth < 10) tempoMonth = '0' + tempoMonth;
if (tempoDate < 10) tempoDate = '0' + tempoDate;
MyDateString = tempoDate + '/' + tempoMonth + '/' + MyDate.getFullYear();
meaa
źródło
5

Możesz użyć operatora trójskładnikowego, aby sformatować datę jak instrukcję „jeśli”.

Na przykład:

var MyDate = new Date();
MyDate.setDate(MyDate.getDate()+10);
var MyDateString = (MyDate.getDate() < 10 ? '0' + MyDate.getDate() : MyDate.getDate()) + '/' + ((d.getMonth()+1) < 10 ? '0' + (d.getMonth()+1) : (d.getMonth()+1)) + '/' + MyDate.getFullYear();

Więc

(MyDate.getDate() < 10 ? '0' + MyDate.getDate() : MyDate.getDate())

byłoby podobne do instrukcji if, gdzie jeśli getDate () zwraca wartość mniejszą niż 10, to zwraca „0” + datę lub zwraca datę, jeśli jest większa niż 10 (ponieważ nie musimy dodawać wiodącego 0). To samo dla miesiąca.

Edycja: Zapomniałem, że getMonth zaczyna się od 0, więc dodał +1, aby to uwzględnić. Oczywiście możesz również powiedzieć d.getMonth () <9:, ale pomyślałem, że użycie +1 pomogłoby ułatwić zrozumienie.

Hellojeffy
źródło
dzięki za wyjaśnienie +1
Bryan A
5

Istnieje inne podejście do rozwiązania tego problemu, slicew JavaScript.

var d = new Date();
var datestring = d.getFullYear() + "-" + ("0"+(d.getMonth()+1)).slice(-2) +"-"+("0" + d.getDate()).slice(-2);

datestringdata powrotu z formatu zgodnie z oczekiwaniami: 01.09.2019

innym podejściem jest użycie dateformatbiblioteki: https://github.com/felixge/node-dateformat

behnam shateri
źródło
Uważaj na pisownię „JavaScript”.
Basil Bourque,
3

Ułatw sobie życie i użyj Moment.js przykładowego kodu:

var beginDateTime = moment()
  .format('DD-MM-YYYY HH:mm')
  .toString();

// Now will print 30-06-2015 17:55
console.log(beginDateTime);
Gonzalo Bahamondez
źródło
4
moment.js -> niezbyt dobre rozwiązanie, bo jego 19,8 tys. kodu w porównaniu z rozwiązaniami o wielkości 0,3 tys.
MarcoZen
3
function formatDate(jsDate){
  // add leading zeroes to jsDate when days or months are < 10.. 
  // i.e.
  //     formatDate(new Date("1/3/2013")); 
  // returns
  //    "01/03/2103"
  ////////////////////
  return (jsDate.getDate()<10?("0"+jsDate.getDate()):jsDate.getDate()) + "/" + 
      ((jsDate.getMonth()+1)<10?("0"+(jsDate.getMonth()+1)):(jsDate.getMonth()+1)) + "/" + 
      jsDate.getFullYear();
}
Alex
źródło
3

Możesz podać opcje jako parametr formatowania daty. Pierwszy parametr dotyczy ustawień regionalnych, które mogą nie być potrzebne, a drugi dotyczy opcji. Aby uzyskać więcej informacji, odwiedź https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

var date = new Date(Date.UTC(2012, 1, 1, 3, 0, 0));
var options = { year: 'numeric', month: '2-digit', day: '2-digit' };
console.log(date.toLocaleDateString(undefined,options));
MJ55
źródło
1
Dziękuję za sugestie.
MJ55,
2

Zawarłem poprawną odpowiedź na to pytanie w funkcji, która może dodawać wiele wiodących zer, ale domyślnie dodaje 1 zero.

function zeroFill(nr, depth){
  depth = (depth === undefined)? 1 : depth;

  var zero = "0";
  for (var i = 0; i < depth; ++i) {
    zero += "0";
  }

  return (zero + nr).slice(-(depth + 1));
}

w przypadku pracy tylko z cyframi i nie więcej niż 2 cyframi jest to również podejście:

function zeroFill(i) {
    return (i < 10 ? '0' : '') + i
  }
Robbie Bardijn
źródło
1

Inna opcja, wykorzystująca wbudowaną funkcję wypełniania (ale skutkuje dość długim kodem!):

myDateString = myDate.getDate().toLocaleString('en-US', {minimumIntegerDigits: 2})
  + '/' + (myDate.getMonth()+1).toLocaleString('en-US', {minimumIntegerDigits: 2})
  + '/' + myDate.getFullYear();

// '12/06/2017'

I jeszcze inne, manipulowanie ciągami za pomocą wyrażeń regularnych:

var myDateString = myDate.toISOString().replace(/T.*/, '').replace(/-/g, '/');

// '2017/06/12'

Należy jednak pamiętać, że rok pokaże się na początku, a dzień na końcu .

joeytwiddle
źródło
najbardziej mi się podobało: myDate.getDate (). toLocaleString ('en-US', {minimumIntegerDigits: 2})
Max Alexander Hanna
1

Dodając do odpowiedzi @modiX, to działa ... NIE ZATRZYMUJ SIĘ, że jest puste

today.toLocaleDateString("default", {year: "numeric", month: "2-digit", day: "2-digit"})
francis
źródło
1

Oto bardzo prosty przykład, jak poradzić sobie z tą sytuacją.

var mydate = new Date();

var month = (mydate.getMonth().toString().length < 2 ? "0"+mydate.getMonth().toString() :mydate.getMonth());

var date = (mydate.getDate().toString().length < 2 ? "0"+mydate.getDate().toString() :mydate.getDate());

var year = mydate.getFullYear();

console.log("Format Y-m-d : ",year+"-"+month+"-" + date);

console.log("Format Y/m/d : ",year+"/"+month+"/" + date);

Vikas Kandari
źródło
0

Poniższe ma na celu wyodrębnienie konfiguracji, podłączenie Date.protoypei zastosowanie konfiguracji.

Użyłem Arraydo przechowywania fragmentów czasu, a gdy push() thisjako Dateobiekt zwraca mi długość do iteracji. Kiedy skończę, mogę używać joinna returnwartości.

Wydaje się, że działa dość szybko: 0,016 ms

// Date protoype
Date.prototype.formatTime = function (options) {
    var i = 0,
        time = [],
        len = time.push(this.getHours(), this.getMinutes(), this.getSeconds());

    for (; i < len; i += 1) {
        var tick = time[i];
        time[i] = tick < 10 ? options.pad + tick : tick;
    }

    return time.join(options.separator);
};

// Setup output
var cfg = {
    fieldClock: "#fieldClock",
    options: {
        pad: "0",
        separator: ":",
        tick: 1000
    }
};

// Define functionality
function startTime() {
    var clock = $(cfg.fieldClock),
        now = new Date().formatTime(cfg.options);

    clock.val(now);
    setTimeout(startTime, cfg.options.tick);
}

// Run once
startTime();

demo: http://jsfiddle.net/tive/U4MZ3/

Tim Vermaelen
źródło
0

Chciałbym utworzyć własnego niestandardowego pomocnika daty, który wygląda następująco:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Add 20 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), 20));

(zobacz także to skrzypce )

John Slegers
źródło
0

Dodaj dopełnienie, aby umożliwić wiodące zero - w razie potrzeby - i konkatenuj, używając wybranego separatora jako łańcucha.

Number.prototype.padLeft = function(base,chr){
        var  len = (String(base || 10).length - String(this).length)+1;
        return len > 0? new Array(len).join(chr || '0')+this : this;
    }

var d = new Date(my_date);
var dformatted = [(d.getMonth()+1).padLeft(), d.getDate().padLeft(), d.getFullYear()].join('/');
TV-C-15
źródło
0

Jak sugeruje @John Henckel, rozpoczęcie korzystania z metody toISOString () ułatwia sprawę

const dateString = new Date().toISOString().split('-');
const year = dateString[0];
const month = dateString[1];
const day = dateString[2].split('T')[0];

console.log(`${year}-${month}-${day}`);

Mario
źródło
0
 let date = new Date();
 let dd = date.getDate();//day of month

 let mm = date.getMonth();// month
 let yyyy = date.getFullYear();//day of week
 if (dd < 10) {//if less then 10 add a leading zero
     dd = "0" + dd;
   }
 if (mm < 10) {
    mm = "0" + mm;//if less then 10 add a leading zero
  }
Deaner
źródło
możesz także krótko opisać, co próbujesz.
Shiv Kumar Baghel
0

wypróbuj to dla podstawowej funkcji, nie wymaga bibliotek

Date.prototype.CustomformatDate = function() {
 var tmp = new Date(this.valueOf());
 var mm = tmp.getMonth() + 1;
 if (mm < 10) mm = "0" + mm;
 var dd = tmp.getDate();
 if (dd < 10) dd = "0" + dd;
 return mm + "/" + dd + "/" + tmp.getFullYear();
};
vishu2124
źródło
0
function pad(value) {
    return value.tostring().padstart(2, 0);
}

let d = new date();
console.log(d);
console.log(`${d.getfullyear()}-${pad(d.getmonth() + 1)}-${pad(d.getdate())}t${pad(d.gethours())}:${pad(d.getminutes())}:${pad(d.getseconds())}`);
Guilherme Oliveira
źródło
2
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
leopal
0

Możesz użyć String.slice (), która wyodrębnia sekcję ciągu i zwraca go jako nowy ciąg, bez modyfikowania oryginalnego ciągu:

const currentDate = new Date().toISOString().slice(0, 10) // 2020-04-16

Możesz też użyć biblioteki lib, takiej jak Moment.js, aby sformatować datę:

const moment = require("moment")
const currentDate = moment().format("YYYY-MM-DD") // 2020-04-16
Julia Ramos
źródło