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á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:
Các setHours
phương pháp có thể mất tùy chọn minutes
, seconds
và ms
tranh 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.000
cá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 setUTCHours
phương pháp.
new Date(new Date().setHours(0,0,0,0))
.
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
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)),
}
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:
moment(DATE_OBJECT).startOf('day').toDate();
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.
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.
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
}
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());
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)