Cách tốt nhất để khởi tạo Ngày JavaScript đến nửa đêm là gì?


438

Cách đơn giản nhất để có được một thể hiện của Ngày mới () nhưng đặt thời gian vào nửa đêm là gì?

Câu trả lời:


871

Các setHoursphương pháp có thể mất tùy chọn minutes, secondsmstranh cãi, ví dụ:

var d = new Date();
d.setHours(0,0,0,0);

Điều đó sẽ thiết lập thời gian để 00:00:00.000các múi giờ hiện tại của bạn , nếu bạn muốn làm việc tại UTC thời gian, bạn có thể sử dụng setUTCHoursphương pháp.


41
FYI, tôi đang chạy phương thức này (d.setHours (0,0,0,0)) trong hàm giảm trên 270K hàng và nhanh hơn 20 giây so với thực hiện d.setHours (0); d.setMinutes (0); d.setSeconds (0); Câu trả lời tuyệt vời @CMS!
jbnunn

32
Điều này cần phải được thực hiện trong hai dòng để giữ d là một đối tượng Date. Gần đây tôi đã sửa một lỗi đã xảy ra trong một dòng: var d = new Date (). SetHours (0, 0, 0, 0). Tuy nhiên, d sau đó là một số, không phải là ngày kể từ setHours trả về một số.
Jason

9
Tôi vừa mới bắt gặp điều này (đến bữa tiệc muộn mà tôi biết), cũng cần một giải pháp một dòng trả về một Ngày. Đối với bất cứ ai tìm kiếm điều này, câu trả lời của @ Zon hoạt động hoàn hảo : new Date(new Date().setHours(0,0,0,0)).
SRack

226

Chỉ muốn làm rõ rằng đoạn trích từ câu trả lời được chấp nhận cho nửa đêm gần nhất trong quá khứ :

var d = new Date();
d.setHours(0,0,0,0); // last midnight

Nếu bạn muốn có được nửa đêm gần nhất trong tương lai , hãy sử dụng mã sau:

var d = new Date();
d.setHours(24,0,0,0); // next midnight

6
Điều gì xảy ra nếu hôm nay dài 25 giờ (đồng hồ điều chỉnh chuyển tiếp cho Tiết kiệm ánh sáng ban ngày)?
qntm

8
Đây là kịch bản phía khách hàng, nửa đêm là nửa đêm, mặc dù tiết kiệm ánh sáng ban ngày .. Cũng đáng chú ý .. không phải nơi nào trên thế giới cũng sử dụng DST (thời gian tiết kiệm ánh sáng ban ngày)
chris

2
@qntm: thay đổi thời gian tiết kiệm ánh sáng ban ngày luôn được áp dụng vào lúc 2 giờ sáng, vì vậy sẽ chỉ còn một nửa đêm trong ngày đó :). Nhưng vâng, 3 giờ sáng có thể xảy ra hai lần trong ngày (facepalm)
Dan

@chris Không, ý tôi là đoạn trích thứ hai. "24 giờ sau nửa đêm hôm nay" không phải lúc nào cũng giống như "nửa đêm ngày mai". Trong những trường hợp này, đoạn mã thứ hai có hoạt động không?
qntm

3
@qntm: Date.setHours không mù quáng thêm 24 giờ, nó thông minh hơn. Thay vào đó, nó trả về dấu thời gian của thời điểm, khi đồng hồ sẽ hiển thị 24 lần tiếp theo. Cân nhắc tiết kiệm thời gian. Cố gắng chơi trong giao diện điều khiển chính mình. Thật thú vị, setHours (25) trả về dấu thời gian của những ngày mai 1 giờ sáng
Dan

68

Một lớp lót cho cấu hình đối tượng:

new Date(new Date().setHours(0,0,0,0));

Khi tạo một phần tử:

dateFieldConfig = {
      name: "mydate",
      value: new Date(new Date().setHours(0, 0, 0, 0)),
}

6
Cảm ơn! tôi đã tự hỏi làm thế nào tôi có thể làm điều đó trong một dòng duy nhất bởi vì tôi đã thiết lập một thuộc tính đối tượng! Câu trả lời chính xác.
Paulo Roberto Rosa

Cảm ơn Zon, điều này đã giúp tôi viết nó một dòng.
HungrySoul

22

Chỉ cần thêm điều này vào đây bởi vì tôi đã vào trang này để tìm cách làm điều này trong khoảnh khắc.js và những người khác cũng có thể làm như vậy.

[Đặt vấn đề: từ "khoảnh khắc" đã xuất hiện ở nơi khác trên trang này để các công cụ tìm kiếm trực tiếp ở đây và khoảnh khắc này đủ rộng để đảm bảo được bảo hiểm về mức độ thường xuyên được đề cập trong các câu hỏi SO liên quan đến ngày khác]

Vì vậy, trong phiên bản 2.0.0 trở lên:

date.startOf('day');

Đối với các phiên bản trước:

date.sod();

Tài liệu:

http://momentjs.com/docs/#/manipulation/start-of/


để lấy lại một đối tượng ngày, sử dụng cái nàymoment(DATE_OBJECT).startOf('day').toDate();
xinthose

2
yay, hãy thêm thư viện javascript 52kb để làm điều gì đó bạn có thể làm trong 2 dòng.
Bruce Lim

19
Và nếu bạn đang sử dụng khoảnh khắc.js vì một trong nhiều lý do tốt thì bạn có thể ...? Làm thế nào về việc đọc lý do tôi đã đưa ra trước khi thêm một bình luận mỉa mai?
andyhasit

11

Bạn có thể sử dụng

new Date().setUTCHours(0,0,0,0)

nếu bạn cần giá trị chỉ một lần.


1
Điều này không có được một thể hiện của Ngày, như OP yêu cầu.
cobberboy

Đây là câu trả lời tốt nhất, nhưng cần chỉnh sửa một chút để trả về một thể hiện của Ngày. Ngày mới (Ngày mới (). setUTCHours (0, 0, 0, 0));
VitFL

4

Thêm tính hữu dụng vào ví dụ của @ Dan, tôi có nhu cầu tìm vào giữa trưa hoặc nửa đêm tiếp theo.

var d = new Date();
if(d.getHours() < 12) {
   d.setHours(12,0,0,0); // next midnight/midday is midday
} else {
   d.setHours(24,0,0,0); // next midnight/midday is midnight
}

Điều này cho phép tôi đặt giới hạn tần suất cho một sự kiện, chỉ cho phép nó xảy ra một lần vào buổi sáng và một lần vào buổi chiều cho bất kỳ khách truy cập nào vào trang web của tôi. Ngày bắt được sử dụng để đặt hết hạn cookie.


4

Nếu tính toán với ngày mùa hè sẽ gây ra thường xuyên hơn 1 giờ hoặc ít hơn một giờ so với nửa đêm (CEST). Điều này gây ra sự khác biệt 1 ngày khi ngày trở lại. Vì vậy, ngày phải làm tròn đến nửa đêm gần nhất. Vì vậy, mã sẽ là (ths to jamisOn):

    var d = new Date();
    if(d.getHours() < 12) {
    d.setHours(0,0,0,0); // previous midnight day
    } else {
    d.setHours(24,0,0,0); // next midnight day
    }

3

Tôi đã tạo ra một vài nguyên mẫu để xử lý việc này cho tôi.

// This is a safety check to make sure the prototype is not already defined.
Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

Date.method('endOfDay', function () {
    var date = new Date(this);
    date.setHours(23, 59, 59, 999);
    return date;
});

Date.method('startOfDay', function () {
    var date = new Date(this);
    date.setHours(0, 0, 0, 0);
    return date;
});

nếu bạn không muốn kiểm tra saftey, thì bạn chỉ có thể sử dụng

Date.prototype.startOfDay = function(){
  /*Method body here*/
};

Ví dụ sử dụng:

var date = new Date($.now()); // $.now() requires jQuery
console.log('startOfDay: ' + date.startOfDay());
console.log('endOfDay: ' + date.endOfDay());

2

Trong trường hợp bạn đã có d3.js làm phụ thuộc trong dự án của mình hoặc không bận tâm đến việc đó, thư viện d3-time ( thư viện d3.js được mô-đun kể từ v4.0.0 ) đã có Khoảng .

Chúng có thể hữu ích khi đặt ngày thành giá trị "mặc định", ví dụ: nửa đêm, 0,00 giây, ngày đầu tiên của tháng, v.v.

var d = new Date(); // Wed Aug 02 2017 15:01:07 GMT+0200 (CEST)
d3.timeHour(d) // Wed Aug 02 2017 00:00:00 GMT+0200 (CEST)
d3.timeMonth(d) // Tue Aug 01 2017 00:00:00 GMT+0200 (CEST)

Vì vậy, tôi đã nhận thấy một xu hướng trong các câu hỏi liên quan đến JavaScript được đăng trên SO: bất kể sự phức tạp của các giải pháp được đưa ra bằng cách sử dụng JS gốc, bất kỳ câu trả lời nào giải quyết vấn đề với sự trợ giúp của một thư viện bên ngoài chắc chắn sẽ bị giảm xuống. Nhận ra điều này, tôi đã cẩn thận đăng câu trả lời của mình với lời nói đầu nhanh: Trong trường hợp bạn đã có example.js làm phụ thuộc . Vậy mà vẫn là downvote, người dùng SO ẩn danh? đau quá, anh bạn: '- (
Peemster

Tôi đã nói rằng câu trả lời này không nên bỏ phiếu đặc biệt là vì một đề xuất sử dụng khoảnh khắc này có 16 phiếu bầu (tại thời điểm viết bình luận này). Nó giải quyết vấn đề một cách rất súc tích và không phải là cách rõ ràng.
lukeatdesignworks
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.