Javascript додає провідні нулі на сьогоднішній день


437

Я створив цей скрипт, щоб обчислити дату на 10 днів заздалегідь у форматі dd / mm / yyyy:

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

Мені потрібно, щоб дата з’явилася з провідними нулями на компонент день і місяць шляхом додавання цих правил до сценарію. Я не можу, здається, змусити його працювати.

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

і

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

Якби хтось міг показати мені, де їх вставити в сценарій, я б дуже вдячний.


6
Як хороша умова, вам слід замінити малі літери першого імені змінних і зарезервувати корпус верблюда для об'єктів / прототипів.
zykadelic

Якщо формат YYYY-MM-DD є прийнятним, це буде дуже хороший відповідь: stackoverflow.com/a/28431880/1717535
Фаб'єн Snauwaert

Відповіді:


1352

Спробуйте це: 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();

Редагувати:

Для пояснення .slice(-2)дає нам два останні символи рядка.

Тож незалежно від того, що ми можемо додати "0"до дня чи місяця, і просто попросити останні два, оскільки це завжди два, яких ми хочемо.

Отже, якщо MyDate.getMonth()повернеться 9, це буде:

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

так що додавання .slice(-2)додає нам останні два символи:

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

Але якщо MyDate.getMonth()повернеться 10, це буде:

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

тому додавання .slice(-2)дає нам два останні символи, або:

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

27
Формат розсилки - формат дати YYYY-MM-DD jsfiddle.net/j6qJp/1 Хтось може бути корисним. Спасибі
tomexx

3
Чи може хтось пояснити, чому це краще, ніж відповідь, яку надає нижче @Aleross? Не одразу зрозуміло, що це робить проти функції накладки, яка явно зрозуміла.
клаудіо

2
Не кажучи вже про те, що сьогодні цей приклад дав мені 26/06/2014 замість 06/06/2014
DazManCat

3
@DazManCat: Це те, що потрібно робити. Код починається з додавання 20 днів до поточної дати. MyDate.setDate(MyDate.getDate() + 20);
монстр cookie

3
@ n00b та @Phil Cooper, не зациклюючись на дискусії про всебічні та мінусові підпрограми JavaScript, я виявив, що slice()техніка у прийнятій відповіді приблизно на 1/10 секунди швидша, ніж техніка @Aleross pad()на 1 мільйон ітерацій. jsFiddle . "платити гроші, брати".
Карл

105

Ось приклад із документів об’єктів Date в Мережі розробників Mozilla за допомогою користувацької функції "pad", без необхідності розширювати прототип Javascript Number. Зручна функція, яку вони наводять як приклад, є

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

А нижче це використовується в контексті.

/* 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

3
Дуже приємний спосіб зробити це. Я вважаю, що прийнята відповідь справді приємна, але це ще чистіше на мій погляд
Бінке

1
це може призвести до несподіваних помилок, оскільки він виводить рядок для <10 і число для> = 10
Девід Фреголі

@DavidFregoli, всі ці дати, що виконують функції рядка, повертають рядок, тому якщо ви вводите рядок, padвиводить лише рядки.
Ромер

56

Новий сучасний спосіб зробити це - використовувати toLocaleDateString, оскільки він не просто дозволяє форматувати дату з належною локалізацією, ви навіть можете передавати параметри формату для архівування потрібного результату:

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);

Коли ви пропустите перший аргумент, він виявить мову браузера. Крім того, ви можете використовувати 2-digitі варіант року.

Якщо вам не потрібно підтримувати старі браузери, такі як IE10, це найчистіший спосіб виконати цю роботу. IE10 та новіші версії не зрозуміють аргумент параметрів.

Примітка. Крім того, існує також можливість toLocaleTimeString, якщо ви хочете локалізувати або відформатувати час дати.


3
Це саме те, що я шукав, дякую. Більше інформації про параметри, доступні для toLocaleDateString тут: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JoseLinares

1
@JoseLinares Привіт, дякую, що повернув це посилання ще за днів. Я просто вирішив покращити свою відповідь, щоб зробити рішення більш привабливим для загальних сценаріїв, оскільки ви можете пропустити перший аргумент і IE10 вже не актуальний. Зважаючи на це, я включив ваше посилання у свою відповідь.
Мартін Браун

@modiX, вибачте, це була моя помилка в коді, і я неправильно описував опис, так, локалі (перша змінна) необов’язково .
Kanhaiya lal

@Kanhaiyalal Не хвилюйтесь, трапляються помилки. Мене тільки здивувало, що 2 з 3 рецензентів також схвалили неправильну редакцію.
Мартін Браун


30

Для вас, людей з майбутнього (ECMAScript 2017 і далі)

Рішення

"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

Пояснення

String.prototype.padStart(targetLength[, padString])додає якомога більше padStringв String.prototypeмішень таким чином, що нова довжина мішені targetLength.

Приклад

"use strict"

let month = "9"

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

let byte = "00000100"

byte = byte.padStart(8, "0") // "00000100"

4
Це частина ES2017 або ES8. Тому неправильно говорити "ES6 +", оскільки це не є частиною ES6 та ES7.
Ноель Ллеварес

1
Технічно це повинно бути, .padStart(2, '0')оскільки другий параметр є рядком, хоча це, мабуть, не має значення, якщо ви не використовуєте TypeScript
bmaupin

Ви маєте рацію, я відредагую свою відповідь.
Амін 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;
}

//в вживанні:

(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
*/

10

Я знайшов найкоротший спосіб це зробити:

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

додасть провідні нулі до всіх самотніх, одноцифрових


Мені подобається це рішення, ви можете, можливо, трохи уточнити, що там відбувається?
Гоблінс

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();

5

Ви можете використати потрійний оператор для форматування дати, як-от "if".

Наприклад:

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();

Тому

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

буде подібним до оператора if, де якщо getDate () повертає значення менше 10, то повертає "0" + дата, або повертає дату, якщо більша за 10 (оскільки нам не потрібно додавати провідну 0). Те саме за місяць.

Редагувати: Забув, що getMonth починається з 0, тому додав +1 для його облікового запису. Звичайно, ви можете також просто сказати d.getMonth () <9:, але я подумав, що використання +1 допоможе полегшити розуміння.


дякую за пояснення +1
Bryan A

5

Існує ще один підхід до вирішення цієї проблеми за допомогою sliceJavaScript.

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

datestringдата повернення з форматом , як ви очікуєте: 2019-09-01

Інший підхід - це використання dateformatбібліотеки: https://github.com/felixge/node-dateformat


Подбайте про написання "JavaScript".
Василь Бурк

3

Зробіть своє життя простішим і використовуйте Moment.js деякий зразок коду:

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

// Now will print 30-06-2015 17:55
console.log(beginDateTime);

4
moment.js -> не гарне рішення набирає 19,8 тис. код коду порівняно з рішеннями розміром 0,3k тут.
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();
}

3

Ви можете надати параметри як параметр для форматування дати. Перший параметр - це локаль, який вам може не знадобитися, а другий - параметри. Для отримання додаткової інформації відвідайте 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));

1
Дякую за пропозиції
MJ55

2

Я запевнив правильну відповідь на це питання у функції, яка може додавати кілька провідних нулів, але за замовчуванням додавати 1 нуль.

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));
}

для роботи лише з числами і не більше 2 цифр, це також підхід:

function zeroFill(i) {
    return (i < 10 ? '0' : '') + i
  }

1

Ще один варіант, використовуючи вбудовану функцію, щоб зробити прокладку (але в результаті виходить досить довгий код!):

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

// '12/06/2017'

І ще, маніпулювання рядками з регулярними виразами:

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

// '2017/06/12'

Але майте на увазі, що один покаже рік на початку та день у кінці .


найбільше сподобалось це: myDate.getDate (). toLocaleString ('en-US', {minimumIntegerDigits: 2})
Макс Олександр Ханна

1

Додавши до @modiX відповідь, це те, що працює ... НЕ залишайте це порожнім

today.toLocaleDateString("default", {year: "numeric", month: "2-digit", day: "2-digit"})

1

Ось дуже простий приклад того, як можна впоратися з цією ситуацією.

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);


0

Нижче націлено витяг конфігурації, підключення Date.protoypeта застосування конфігурації.

Я використовував Arrayдля зберігання фрагментів часу, і коли я push() thisяк Dateоб'єкт, він повертає мені довжину до ітерації. Коли я зробив, я можу використовувати joinна returnзначення.

Здається, це працює досить швидко: 0,016 мс

// 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();

демо: http://jsfiddle.net/tive/U4MZ3/


0

Що я б робив, це створити власний власний помічник дати, який виглядає приблизно так:

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));

(див. також цей Fiddle )


0

Додайте трохи прокладки, щоб дозволити провідний нуль - там, де це потрібно - і об'єднайте, використовуючи свій роздільник, який вибираєте як рядок.

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('/');

0

Як пропонує @John Henckel, початок використання методу toISOString () полегшує справи

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}`);


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
  }

ви також можете коротко описати, що ви намагаєтесь.
Шив Кумар Багель

0

спробуйте це для основної функції, не потрібні бібліотеки

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();
};

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())}`);

2
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
леопаль

0

Ви можете використовувати String.slice (), який витягує розділ рядка і повертає його як новий рядок, не змінюючи початковий рядок:

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

Або ви також можете скористатися lib, таким як Moment.js, для форматування дати:

const moment = require("moment")
const currentDate = moment().format("YYYY-MM-DD") // 2020-04-16
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.