2009-06-26 38 views
260

Nó làm tôi ngạc nhiên rằng đối tượng Date của Javascript không thực hiện một chức năng thêm của bất kỳ loại nào.Thêm giờ vào đối tượng Ngày Javascript?

tôi chỉ đơn giản muốn có một chức năng có thể làm điều này:

var now = Date.now(); 
var fourHoursLater = now.addHours(4); 

function Date.prototype.addHours(h) { 

    // how do I implement this? 

} 

tôi sẽ chỉ đơn giản như một số gợi ý theo một hướng.

  • Tôi có cần phải phân tích cú pháp chuỗi không?

  • Tôi có thể sử dụng setTime không?

  • Mất khoảng một phần nghìn giây?

Như thế này:

new Date(milliseconds + 4*3600*1000 /*4 hrs in ms*/)? 

Điều này có vẻ thực sự hackish mặc dù - và nó thậm chí làm việc?

Trả lời

243

Bản thân JavaScript có API Ngày/Giờ khủng khiếp. Đây là cách duy nhất để làm điều đó trong JavaScript thuần túy. Tôi khuyên bạn nên sử dụng Datejs - theo đề xuất của Nosredna - nếu bạn đang thực hiện rất nhiều thao tác ngày, mặc dù vậy.

Date.prototype.addHours = function(h) {  
    this.setTime(this.getTime() + (h*60*60*1000)); 
    return this; 
} 
+112

Đây không phải là cách duy nhất: 'someDate.setHours (someDate.getHours() + 1);' –

+2

Tôi thích điều này vì nó hoạt động với thời gian độc lập với công cụ Timezone, phải không? Vì vậy, việc thêm 12 giờ qua, nói rằng, thay đổi múi giờ trong múi giờ địa phương sẽ vẫn dẫn đến chênh lệch thời gian chính xác là 12 giờ. –

+0

@InancGumus bạn đã sai! Phương pháp của tôi cũng sẽ tạo ra thời gian chính xác. Hãy dùng thử trong bảng điều khiển trình duyệt của bạn. –

6

Có thư thêm trong thư viện Datejs.

Và đây là JavaScript date methods. kennebec được đề cập một cách khôn ngoan getHours() và setHours();

+0

Lưu ý rằng thư viện đó có vẻ ở trạng thái alpha. – Sam

316
Date.prototype.addHours= function(h){ 
    this.setHours(this.getHours()+h); 
    return this; 
} 

Test:

alert(new Date().addHours(4)); 
+2

Wow - dễ hơn tôi tưởng. –

+19

Tôi không nghĩ rằng công trình này --- thử nghiệm nó trên một cái gì đó với giờ 23, ví dụ? Câu trả lời của Jason Harwig là những gì tôi nghĩ đến. – Domenic

+8

Có vẻ như hoạt động, ngay cả khi đó là 23:00. – Remy

34

Nó có lẽ là tốt hơn để thực hiện phương pháp addHours bất biến bằng cách trả lại một bản sao của đối tượng ngày chứ không phải là đột biến tham số của nó.

Date.prototype.addHours= function(h){ 
    var copiedDate = new Date(this.getTime()); 
    copiedDate.setHours(copiedDate.getHours()+h); 
    return copiedDate; 
} 

Bằng cách này, bạn có thể chuỗi các cuộc gọi phương thức mà không phải lo lắng về trạng thái.

+0

Chức năng này có vấn đề tương tự như đã nêu ra ở đây http://stackoverflow.com/questions/1050720/adding-hours-to-javascript-date-object#comment4305695_1051641 Nó không thực sự về việc liệu nó hoạt động trên các trình duyệt nhất định, nhưng những nơi khác mà sử dụng Javascript xem đây là một vấn đề. chải giải pháp của bạn với http://stackoverflow.com/a/1050782/295535 này dường như là giải pháp tốt nhất – Ressu

+5

+1 cho bất biến. – Habib

+1

Bạn nên cân nhắc việc thay đổi tên hàm, vì từ 'add *' thường được sử dụng để biến đổi chính đối tượng đó. – mr5

2

Cách khác để xử lý việc này là chuyển đổi ngày thành unixtime (epoch), sau đó thêm số tương đương sau (milli) giây, sau đó chuyển đổi lại. Bằng cách này, bạn có thể xử lý các chuyển đổi ngày và tháng, như thêm 4 giờ đến 21, điều này sẽ dẫn đến ngày hôm sau, 01:00.

12

Phiên bản do kennebec đề xuất sẽ không thành công khi chuyển sang hoặc từ DST, vì đó là số giờ được đặt.

this.setUTCHours(this.getUTCHours()+h); 

sẽ thêm h giờ để this không phụ thuộc vào đặc thù hệ thống thời gian. Phương pháp của Jason Harwig cũng hoạt động.

+0

Điều này có ý nghĩa. –

13

Bạn có thể sử dụng thư viện momentjs http://momentjs.com/.

var moment = require('moment'); 
foo = new moment(something).add(10, 'm').toDate(); 
+2

Thời điểm là đáng yêu –

+1

Cách thêm 10 phút với 10 000 dòng mã :). Minus 1 từ tôi. –

6

Tôi cũng nghĩ rằng đối tượng gốc không được sửa đổi.Vì vậy, để tiết kiệm nhân lực trong tương lai, đây là một giải pháp kết hợp dựa trên Jason Harwig'sTahir Hasan câu trả lời:

Date.prototype.addHours= function(h){ 
    var copiedDate = new Date(); 
    copiedDate.setTime(this.getTime() + (h*60*60*1000)); 
    return copiedDate; 
} 
3

Kiểm tra nếu nó vẫn chưa được xác định, nếu không định nghĩa nó vào Ngày prototype:

if (!Date.prototype.addHours) { 
    Date.prototype.addHours = function(h) { 
     this.setHours(this.getHours() + h); 
     return this; 
    }; 
} 
55

Mã dưới đây là thêm 4 giờ cho đến nay (ví dụ hiện nay ngày)

var today = new Date(); 
today.setHours(today.getHours() + 4); 
+0

Tôi không thấy điều này và đưa ra câu trả lời trùng lặp. Tôi thích phương pháp này. Chính xác và hữu ích. –

+0

Điều này dường như không hoạt động khi giờ là số thập phân (không phải số nguyên) – gregmagdits

+1

Đây là câu trả lời hay nhất ở đây ... thêm "addHours" vào nguyên mẫu Date là đáng lo ngại vì tại một số điểm JS có thể thêm hỗ trợ cho hàm đó bạn có một nguyên mẫu xung đột. Điều này giúp bạn có được một chức năng chỉ bằng cách sử dụng nhiều mã. –

3

Đối với một add đơn giản/trừ chức năng giờ/phút trong javascript, hãy thử này:

function getTime (addHour, addMin){ 
    addHour = (addHour?addHour:0); 
    addMin = (addMin?addMin:0); 
    var time = new Date(new Date().getTime()); 
    var AM = true; 
    var ndble = 0; 
    var hours, newHour, overHour, newMin, overMin; 
    //change form 24 to 12 hour clock 
    if(time.getHours() >= 13){ 
     hours = time.getHours() - 12; 
     AM = (hours>=12?true:false); 
    }else{ 
     hours = time.getHours(); 
     AM = (hours>=12?false:true); 
    } 
    //get the current minutes 
    var minutes = time.getMinutes(); 
    // set minute 
    if((minutes+addMin) >= 60 || (minutes+addMin)<0){ 
     overMin = (minutes+addMin)%60; 
     overHour = Math.floor((minutes+addMin-Math.abs(overMin))/60); 
     if(overMin<0){ 
      overMin = overMin+60; 
      overHour = overHour-Math.floor(overMin/60); 
     } 
     newMin = String((overMin<10?'0':'')+overMin); 
     addHour = addHour+overHour; 
    }else{ 
     newMin = minutes+addMin; 
     newMin = String((newMin<10?'0':'')+newMin); 
    } 
    //set hour 
    if((hours+addHour>=13)||(hours+addHour<=0)){ 
     overHour = (hours+addHour)%12; 
     ndble = Math.floor(Math.abs((hours+addHour)/12)); 
     if(overHour<=0){ 
      newHour = overHour+12; 
      if(overHour == 0){ 
       ndble++; 
      } 
     }else{ 
      if(overHour ==0){ 
       newHour = 12; 
       ndble++; 
      }else{ 
       ndble++; 
       newHour = overHour; 
      } 
     } 
     newHour = (newHour<10?'0':'')+String(newHour); 
     AM = ((ndble+1)%2===0)?AM:!AM; 
    }else{ 
     AM = (hours+addHour==12?!AM:AM); 
     newHour = String((Number(hours)+addHour<10?'0':'')+(hours+addHour)); 
    } 
    var am = (AM)?'AM':'PM'; 
    return new Array(newHour, newMin, am); 
}; 

này có thể được sử dụng mà không thông số để có được thời gian hiện tại

getTime(); 

hoặc với các thông số để có được thời gian với biên bản thêm/giờ

getTime(1,30); // adds 1.5 hours to current time 
getTime(2); // adds 2 hours to current time 
getTime(0,120); // same as above 

thời gian thậm chí tiêu cực làm việc

getTime(-1, -30); // subtracts 1.5 hours from current time 

niềm vui này ction trả về một mảng của

array([Hour], [Minute], [Meridian]) 
2

Nếu bạn không muốn sử dụng một thư viện và muốn được đồng bằng javascript giải pháp, bạn có thể sử dụng dateAdd() function này tôi đã viết. Nó hoạt động với thời gian tiết kiệm ánh sáng ban ngày và cho phép bạn thêm phút, giờ, ngày, tuần, v.v.

Ví dụ:

var now = Date.now(); 
var then = dateAdd(now, 4, 'hours'); 

này sẽ trả về một đối tượng ngày tăng thêm 4 giờ.

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