Javascript thêm số 0 hàng đầu cho đến nay


437

Tôi đã tạo tập lệnh này để tính toán ngày trước 10 ngày theo định dạng dd / mm / yyyy:

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

Tôi cần phải có ngày xuất hiện với các số 0 đứng đầu trên thành phần ngày và tháng bằng cách thêm các quy tắc này vào tập lệnh. Tôi dường như không thể làm cho nó hoạt động.

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

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

Nếu ai đó có thể chỉ cho tôi nơi chèn những thứ này vào kịch bản thì tôi sẽ thực sự cảm kích.


6
Như một quy ước tốt, bạn nên viết thường ký tự đầu tiên trong tên biến và vỏ lạc đà dự trữ cho các đối tượng / nguyên mẫu.
zykadelic

Nếu định dạng YYYY-MM-DD có thể chấp nhận được, đây sẽ là một câu trả lời rất hay: stackoverflow.com/a/28431880/1717535
Fabien Snauwaert

Câu trả lời:


1351

Hãy thử điều này: 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();

BIÊN TẬP:

Để giải thích, .slice(-2)cung cấp cho chúng tôi hai ký tự cuối cùng của chuỗi.

Vì vậy, không có vấn đề gì, chúng ta có thể thêm "0" vào ngày hoặc tháng, và chỉ yêu cầu hai người cuối cùng vì đó luôn là hai thứ chúng ta muốn.

Vì vậy, nếu MyDate.getMonth()trả về 9, nó sẽ là:

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

vì vậy việc thêm .slice(-2)vào đó cho chúng ta hai ký tự cuối cùng là:

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

Nhưng nếu MyDate.getMonth()trả về 10, nó sẽ là:

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

vì vậy việc thêm .slice(-2)cho chúng ta hai ký tự cuối cùng, hoặc:

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

27
Ngã ba - định dạng ngày YYYY-MM-DD jsfiddle.net/j6qJp/1 Nó có thể hữu ích cho ai đó. Cảm ơn
tomexx

3
Ai đó có thể giải thích tại sao điều này tốt hơn câu trả lời mà @Aleross cung cấp dưới đây không? Nó không ngay lập tức rõ ràng những gì nó làm so với chức năng pad rõ ràng rõ ràng.
claudio

2
Chưa kể rằng hôm nay ví dụ này đã cho tôi 26/06/2014 thay vì 06/06/2014
DazManCat

3
@DazManCat: Đó là những gì nó phải làm. Mã bắt đầu bằng cách thêm 20 ngày vào ngày hiện tại. MyDate.setDate(MyDate.getDate() + 20);
cookie quái vật

3
@ n00b và @Phil Cooper, không bị gác máy khi thảo luận về các hoạt động thường xuyên của JavaScript, tôi thấy rằng slice()kỹ thuật trong câu trả lời được chấp nhận nhanh hơn khoảng 1/10 giây so với pad()kỹ thuật của @Aleross 1 triệu lần lặp. jsFiddle . "Trả tiền của bạn, chọn của bạn".
Karl

105

Dưới đây là một ví dụ từ các tài liệu đối tượng Date trên Mạng của Nhà phát triển Mozilla bằng cách sử dụng chức năng "pad" tùy chỉnh mà không phải mở rộng nguyên mẫu Số của Javascript. Hàm tiện dụng mà họ đưa ra làm ví dụ là

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

Và dưới đây là nó đang được sử dụng trong bối cảnh.

/* 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
Cách làm rất tốt Tôi nghĩ rằng câu trả lời được chấp nhận là thực sự tốt, nhưng theo tôi thì nó thậm chí còn sạch hơn
Binke

1
điều này có thể dẫn đến các lỗi không mong muốn khiến nó xuất ra một chuỗi cho <10 và một số cho> = 10
David Fregoli

@DavidFregoli, tất cả các hàm ngày đến chuỗi đều trả về một chuỗi, vì vậy nếu bạn nhập chuỗi, padsẽ chỉ xuất chuỗi.
Rohmer

55

Cách hiện đại mới để làm điều này là sử dụng toLocaleDateString, bởi vì nó không chỉ cho phép bạn định dạng một ngày với bản địa hóa phù hợp, thậm chí bạn có thể vượt qua các tùy chọn định dạng để lưu trữ kết quả mong muốn:

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

Thay vào đó, khi bạn bỏ qua đối số đầu tiên, nó sẽ phát hiện ngôn ngữ trình duyệt. Ngoài ra, bạn cũng có thể sử dụng 2-digittùy chọn năm.

Nếu bạn không cần hỗ trợ các trình duyệt cũ như IE10, đây là cách sạch nhất để thực hiện công việc. IE10 và các phiên bản thấp hơn sẽ không hiểu đối số tùy chọn.

Lưu ý: Ngoài ra, cũng có toLocaleTimeString, nếu bạn muốn bản địa hóa hoặc định dạng thời gian của một ngày.


3
Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn. Thông tin thêm về các tùy chọn có sẵn cho toLocaleDateString tại đây: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
trộm

1
@JoseLinares Xin chào, cảm ơn vì đã đưa liên kết này trở lại trong những ngày qua. Tôi chỉ quyết định cải thiện câu trả lời của mình để làm cho giải pháp trở nên hấp dẫn hơn đối với các tình huống phổ biến, vì bạn có thể bỏ qua đối số đầu tiên và IE10 không còn phù hợp nữa. Với ý nghĩ đó, tôi đã bao gồm liên kết của bạn vào câu trả lời của tôi.
Martin Braun

@modiX, xin lỗi, đó là lỗi của tôi trong mã và tôi đã hiểu sai cách mô tả, Có địa phương (biến đầu tiên) là Tùy chọn .
Kanhaiya lal

@Kanhaiyalal Đừng lo lắng, sai lầm có thể xảy ra. Tôi chỉ ngạc nhiên khi 2 trong số 3 người đánh giá cũng chấp thuận chỉnh sửa sai.
Martin Braun

51

Bạn có thể định nghĩa hàm "str_pad" (như trong php):

function str_pad(n) {
    return String("00" + n).slice(-2);
}

9
"0" thay vì "00" là đủ
David Fregoli

Câu trả lời tốt nhất cho đến nay.
Lucas Andrade

29

Dành cho bạn những người đến từ tương lai (ECMAScript 2017 trở lên)

Giải pháp

"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

Giải thích

các String.prototype.padStart(targetLength[, padString])thêm càng nhiều càng tốt padStringtrong String.prototypemục tiêu sao cho chiều dài mới của mục tiêu là targetLength.

Thí dụ

"use strict"

let month = "9"

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

let byte = "00000100"

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

4
Đây là một phần của ES2017 hoặc ES8. Vì vậy, không đúng khi nói "ES6 +" vì nó không phải là một phần của ES6 và ES7.
Noel Llevares

Về mặt kỹ thuật thì điều này phải là .padStart(2, '0')vì tham số thứ hai là một chuỗi, mặc dù nó có thể không thành vấn đề trừ khi bạn sử dụng
TypeScript

Bạn đã đúng, tôi sẽ chỉnh sửa câu trả lời của tôi.
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;
}

// đang sử dụng:

(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

Tôi tìm thấy cách ngắn hơn để làm điều này:

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

sẽ thêm các số 0 đứng đầu cho tất cả các chữ số đơn lẻ


Tôi thích giải pháp này, bạn có thể làm rõ một chút những gì xảy ra ở đó không?
Yêu tinh

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

Bạn có thể sử dụng toán tử ternary để định dạng ngày như một câu lệnh "nếu".

Ví dụ:

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

Vì thế

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

sẽ tương tự như một câu lệnh if, trong đó nếu getDate () trả về giá trị nhỏ hơn 10, thì trả về '0' + Ngày hoặc nếu không trả về ngày nếu lớn hơn 10 (vì chúng ta không cần thêm giá trị hàng đầu 0). Tương tự cho tháng.

Chỉnh sửa: Quên rằng getMonth bắt đầu bằng 0, vì vậy đã thêm +1 vào tài khoản cho nó. Tất nhiên bạn cũng có thể chỉ cần nói d.getMonth () <9 :, nhưng tôi cho rằng sử dụng +1 sẽ giúp dễ hiểu hơn.


cảm ơn vì đã giải thích +1
Bryan A

5

Có một cách tiếp cận khác để giải quyết vấn đề này, sử dụng slicetrong JavaScript.

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

những datestringngày trở lại với định dạng như bạn mong đợi: 2019/09/01

một cách tiếp cận khác là sử dụng dateformatthư viện: https://github.com/felixge/node-dateformat


Hãy cẩn thận khi đánh vần "JavaScript".
Basil Bourque

3

Làm cho cuộc sống của bạn dễ dàng hơn và sử dụng một số mã mẫu của Moment.js :

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

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

4
khoảnh khắc.js -> không phải là một giải pháp tốt với mã 19,8k của nó so với các giải pháp có kích thước 0,3k ở đây.
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

Bạn có thể cung cấp các tùy chọn như một tham số để định dạng ngày. Tham số đầu tiên là cho miền địa phương mà bạn có thể không cần và thứ hai là cho các tùy chọn. Để biết thêm thông tin, hãy truy cập 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
Cảm ơn bạn đã góp ý.
MJ55

2

Tôi đã gói câu trả lời đúng của câu hỏi này trong một hàm có thể thêm nhiều số 0 đứng đầu nhưng mặc định là thêm 1 không.

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

chỉ làm việc với các số và không quá 2 chữ số, đây cũng là một cách tiếp cận:

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

1

Một tùy chọn khác, sử dụng chức năng tích hợp để thực hiện phần đệm (nhưng dẫn đến mã khá dài!):

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

// '12/06/2017'

Và một cách khác, thao tác các chuỗi với các biểu thức thông thường:

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

// '2017/06/12'

Nhưng hãy lưu ý rằng người ta sẽ hiển thị năm khi bắt đầu và ngày kết thúc .


thích điều này nhất: myDate.getDate (). toLocaleString ('en-US', {minimIntegerDigits: 2})
Max Alexander Hanna

1

Thêm vào câu trả lời @modiX, đây là những gì hoạt động ... ĐỪNG RÚT RÀNG

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

1

Dưới đây là ví dụ rất đơn giản về cách bạn có thể xử lý tình huống này.

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

Sau đây nhằm mục đích trích xuất cấu hình, móc vào Date.protoypevà áp dụng cấu hình.

Tôi đã sử dụng một Arraykhối để lưu trữ thời gian và khi tôi push() thislà một Dateđối tượng, nó sẽ trả về cho tôi độ dài để lặp lại. Khi tôi làm, tôi có thể sử dụng jointrên các returngiá trị.

Điều này dường như hoạt động khá nhanh: 0,016ms

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

bản demo: http://jsfiddle.net/tive/U4MZ3/


0

Những gì tôi sẽ làm, là tạo trình trợ giúp Ngày tùy chỉnh của riêng tôi trông như thế này:

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

(xem thêm Fiddle này )


0

Thêm một số phần đệm để cho phép số 0 đứng đầu - khi cần - và nối bằng cách sử dụng dấu phân cách bạn chọn dưới dạng chuỗi.

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

Như @John Henckel gợi ý, bắt đầu sử dụng phương thức toISOString () giúp mọi việc dễ dàng hơn

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
  }

bạn cũng có thể mô tả ngắn gọn những gì bạn cố gắng.
Shiv Kumar Baghel

0

Hãy thử điều này cho một chức năng cơ bản, không cần thư viện

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
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
leopal

0

Bạn có thể sử dụng String.slice () để trích xuất một phần của chuỗi và trả về nó dưới dạng một chuỗi mới, mà không sửa đổi chuỗi gốc:

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

Hoặc bạn cũng có thể sử dụng một lib như Moment.js để định dạng ngày:

const moment = require("moment")
const currentDate = moment().format("YYYY-MM-DD") // 2020-04-16
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.