2011-09-03 42 views
24

Tôi đang làm việc trên một dự án đòi hỏi một thời gian trong tương lai phải được thiết lập bằng cách sử dụng đối tượng Date.Cách làm tròn giờ gần nhất bằng cách sử dụng đối tượng ngày JavaScript

Ví dụ:

futureTime = new Date(); 
futureTime.setHours(futureTime.getHours()+2); 

Câu hỏi của tôi là; một khi ngày trong tương lai được thiết lập, làm thế nào tôi có thể làm tròn đến giờ đầy đủ gần nhất và sau đó thiết lập var thời gian tương lai với nó?

Ví dụ:

Given 8:55 => var futureTime = 9:00 
Given 16:23 => var futureTime = 16:00 

Bất kỳ trợ giúp sẽ được đánh giá cao!

Trả lời

39

Vòng biên bản và sau đó xóa các phút:

var date = new Date(2011,1,1,4,55); // 4:55 
roundMinutes(date); // 5:00 

function roundMinutes(date) { 

    date.setHours(date.getHours() + Math.round(date.getMinutes()/60)); 
    date.setMinutes(0); 

    return date; 
} 
+0

Rất tốt; cảm ơn bạn! – dSquared

+3

Điều này có thể không chính xác tùy thuộc vào những gì bạn mong đợi. Ví dụ. nếu thời gian là 4: 55: 23.100 (hoặc 4:55 và 23 giây, 100 mili giây) thì chức năng này sẽ đặt thời gian thành 5: 00: 23.100 (hoặc 5:00 và 23 giây và 100 mili giây). –

+1

Điều này không đúng vì những gì @Felix đã viết, mà còn vì bạn không sử dụng chức năng Ngày UTC có thể dẫn đến hành vi lỗi trong thời gian thay đổi thời gian mùa hè và ngược lại (kết quả sẽ khác trong các trình duyệt khác nhau) . – ivoszz

2

Một giải pháp, đó là không có nơi gần như duyên dáng như IAbstractDownvoteFactory của

var d = new Date(); 
if(d.getMinutes() >= 30) { 
    d.setHours(d.getHours() + 1); 
} 
d.setMinutes(0); 
15

Một cách hơi đơn giản:

var d = new Date(); 
d.setMinutes (d.getMinutes() + 30); 
d.setMinutes (0); 
+0

Tôi thích điều này, nó đơn giản và nó cũng sẽ thay đổi đối tượng ngày thay vì chỉ đơn giản là trả về một đại diện. – rlemon

+0

Điều này thật tuyệt vời. Cảm ơn. – Waymond

+0

Lưu ý: Điều này có thể không chính xác tùy thuộc vào những gì bạn mong đợi. Ví dụ. nếu thời gian là 4: 55: 23.100 (hoặc 4:55 và 23 giây, 100 mili giây) thì chức năng này sẽ đặt thời gian thành 5: 00: 23.100 (hoặc 5:00 và 23 giây và 100 mili giây) –

2

Hoặc bạn có thể kết hợp cả hai với kích thước tối ưu. http://jsfiddle.net/HkEZ7/

function roundMinutes(date) { 
    return date.getMinutes() >= 30 ? date.getHours() + 1 : date.getHours(); 
} 
7

Những câu trả lời khác bỏ qua giây và mili giây thành phần của ngày. Tôi sẽ làm một việc như sau:

function roundToHour(date) { 
    p = 60 * 60 * 1000; // milliseconds in an hour 
    return new Date(Math.round(date.getTime()/p) * p); 
} 

var date = new Date(2011,1,1,4,55); // 4:55 
roundToHour(date); // 5:00 

date = new Date(2011,1,1,4,25); // 4:25 
roundToHour(date); // 4:00 
+0

tôi đồng ý, tôi cũng chỉ thấy dễ dàng hơn khi làm việc với thời gian bằng mili giây (số), mọi thứ sau đó chỉ trở thành phép toán cơ bản – kkemple

+1

+1 để gắn bó với phép tính mili giây. Tuy nhiên, điều đáng chú ý là việc sử dụng 'Math.ceil' sẽ luôn luôn tròn lên và không cho bạn _gần nhất giờ_ như được chỉ định trong câu hỏi. –

+1

Cảm ơn @MarkEdington! Tôi đã cập nhật mã để làm tròn đến giờ gần nhất thay vì làm tròn lên. –

Các vấn đề liên quan