Thêm giờ vào đối tượng Ngày JavaScript?


400

Điều làm tôi ngạc nhiên là đối tượng Date của JavaScript không thực hiện chức năng thêm bất kỳ loại nào.

Tôi chỉ đơn giản muốn 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 chỉ đơn giản là muốn một số con trỏ theo một hướng.

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

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

  • Làm thế nào về mili 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 - và thậm chí nó có hoạt động không?

Câu trả lời:


424

Bản thân JavaScript có API Ngày / Giờ khủng khiếp. Tuy nhiên, bạn có thể làm điều này bằng JavaScript thuần túy:

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

Hoạt động như một lá bùa! Cảm ơn bạn
moreirapontocom 24/10/19

Nếu mỗi lần nói rằng bạn đã thêm một giờ khiến nó chuyển sang ngày hôm sau, điều này có bắt được nó và tăng mọi thứ đúng cách không (ngày tháng năm)?
cdoern

@cdoern Tôi nghĩ rằng nó sẽ như vậy, vì getTime () sẽ trả về mili giây và bạn chỉ cần thêm nhiều mili giây vào đó
The1993

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

Kiểm tra:

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

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

11
Đó là cách thực hành tồi để thêm mọi thứ vào một nguyên mẫu đối tượng trong Javascript và Domenic là chính xác, điều này không hoạt động. Giải pháp của Jason Harwig dưới đây là tốt hơn.
iKode

19
@Domenic Điều này hoạt động tốt với 23:00, được thử nghiệm trong bảng điều khiển JavaScript của Firefox 10, Chrome 21 và IE 8/9 Ở đây mã tôi đã sử dụng để kiểm tra: var date = new Date(2012, 10, 22, 23, 0, 1); date.toString(); // Thu Nov 22 2012 23:00:01 GMT+0100 (CET) date.setHours(date.getHours() + 1); date.toString(); // Fri Nov 23 2012 00:00:01 GMT+0100 (CET) Nó cũng hoạt động tốt với setMinutes ()
tanguy_k

4
Gặp vấn đề với giải pháp này - Tăng thêm 1 lần cho tôi tại điểm chuyển đổi DST (di chuyển đồng hồ về phía trước một giờ).
andrewb

2
Cũng bị cắn bởi điều này - Tôi đã lặp đi lặp lại hàng giờ bằng cách sử dụng setHours (getHours-1): bây giờ, vào giờ DST đầu tiên, kết thúc này là một vòng lặp vô hạn. Vì vậy, hãy kiểm tra kết quả!
cfstras

165

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

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

Nó sẽ không gây ra lỗi nếu bạn cố thêm 4 đến 23 (xem tài liệu ):

Nếu một tham số bạn chỉ định nằm ngoài phạm vi dự kiến, setHours () cố gắng cập nhật thông tin ngày trong đối tượng Date tương ứng


Tôi đã không nhìn thấy điều này và thực hiện một 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.
Gandalf trắng

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

3
Đây là câu trả lời tốt 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 chức năng đó và sau đó bạn có một nguyên mẫu xung đột. Điều này mang lại cho bạn một chức năng với việc sử dụng gần như nhiều mã.
Kris Boyd

ngạc nhiên, nhưng nó thực sự tăng ngày, tháng nếu cần, liên kết đến các tài liệu sẽ hữu ích
2oppin

4
Mặc dù sử dụng giá trị giờ> 23 không phá vỡ điều này, nhưng dù sao nó cũng bị phá vỡ ở ranh giới tiết kiệm ánh sáng ban ngày . Vì nó bị hỏng, không có lý do để sử dụng nó; thích setTimehoặc setUTCHour.
Đánh dấu Amery

40

Có lẽ tốt hơn là làm cho phương thức addHours bất biến bằng cách trả về một bản sao của đối tượng Date thay vì thay đổi 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ể xâu chuỗi một loạt các cuộc gọi phương thức mà không phải lo lắng về trạng thái.


Hàm này có các vấn đề tương tự như đã nêu ở đây stackoverflow.com/questions/1050720/ triệt Nó không thực sự về việc nó có hoạt động trên một số trình duyệt nhất định hay không, nhưng những nơi khác sử dụng Javascript xem đây là một vấn đề. kết hợp giải pháp của bạn với một stackoverflow.com/a/1050782/295535 dường như là giải pháp tốt nhất
Ressu

1
Bạn nên xem xét việc thay đổi tên hàm, vì từ add*này thường được sử dụng để tự biến đổi đối tượng.
mr5

@ mr5 - không chắc chắn về điều đó, addđược sử dụng trong lớp .NET framework DateTimerất nhiều và có cùng ý nghĩa với +(cộng) trong Toán học.
Tahir Hassan

1
currentDate.addHours(1)<- Từ bản năng lập trình của tôi, tôi hy vọng currentDategiá trị sẽ thay đổi, nhưng trong quá trình thực hiện của bạn, điều đó sẽ không xảy ra. Về lý do tại sao tôi đề nghị đổi tên hoặc thay đổi chữ ký của nó thành một cái gì đó
mr5

1
@TahirHassan không có gì để làm với các chi tiết kỹ thuật nhưng về việc chọn đúng từ để sử dụng cho tên hàm. Tôi vẫn thích phiên bản có thể thay đổi khi chức năng được bắt đầu bằngadd
mr5

23

Phiên bản được đề xuất bởi kennebec sẽ thất bại khi thay đổi thành hoặc từ DST, vì đó là số giờ được đặt.

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

sẽ thêm hgiờ để thisđộc lập với đặc thù của hệ thống thời gian. Phương pháp của Jason Harwig cũng hoạt động.


19

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

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

7

Tôi cũng nghĩ rằng đối tượng ban đầu không nên đượ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 câu trả lời của Jason HarwigTahir Hasan :

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


4

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

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

3

Một cách khác để xử lý việc này là chuyển đổi ngày thành unixtime (epoch), sau đó thêm tương đương trong (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ờ vào 21, sẽ dẫn đến ngày hôm sau, 01:00.


Bạn nói đúng - nhưng bạn cũng trễ vài năm. Câu trả lời của Jason Harwig cho thấy phương pháp này 2 năm trước bạn; Câu trả lời này không có gì mới.
Đánh dấu Amery

3

Để có chức năng thêm / bớt giờ / phút đơn giản trong javascript, hãy thử điều 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);
};

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

getTime();

hoặc với các tham số để có được thời gian với số phút / giờ được thêm vào

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ậm chí thời gian tiêu cực làm việc

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

Hàm này trả về một mảng

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

Con quái vật 56 dòng này có lợi thế gì so với cách tiếp cận hai dòng trong câu trả lời được bình chọn hàng đầu ? -1 bởi vì có sự phức tạp cực lớn ở đây không có lợi ích gì tôi có thể thấy.
Đánh dấu Amery

1

XUÂN là chính xác. Để tính đến đầu / cuối tháng và năm, bạn cần chuyển đổi sang Epoch và quay lại.

Đây là cách bạn làm điều đó:

var milliseconds = 0;          //amount of time from current date/time
var sec = 0;                   //(+): future
var min = 0;                   //(-): past
var hours = 2;
var days = 0;

var startDate = new Date();     //start date in local time (we'll use current time as an example)

var time = startDate.getTime(); //convert to milliseconds since epoch

//add time difference
var newTime = time + milliseconds + (1000*sec) + (1000*60*min) + (1000*60*60*hrs) + (1000*60*60*24)

var newDate = new Date(newTime);//convert back to date; in this example: 2 hours from right now


hoặc thực hiện trong một dòng (trong đó tên biến giống như trên:

var newDate = 
    new Date(startDate.getTime() + millisecond + 
        1000 * (sec + 60 * (min + 60 * (hours + 24 * days))));

0

Đây là một cách dễ dàng để có được giá trị dữ liệu tăng hoặc giảm.

const date = new Date()
const inc = 1000 * 60 * 60 // an hour
const dec = (1000 * 60 * 60) * -1 // an hour

const _date = new Date(date)
return new Date( _date.getTime() + inc )
return new Date( _date.getTime() + dec )

-1

Một chút lộn xộn, nhưng nó hoạt động!

Đưa ra một định dạng ngày như thế này: 2019-04-03T15: 58

  //Get the start date.
  var start = $("#start_date").val();
  //Split the date and time.
  var startarray = start.split("T");
  var date = startarray[0];
  var time = startarray[1];

  //Split the hours and minutes.
  var timearray = time.split(":");

  var hour = timearray[0];
  var minute = timearray[1];
  //Add an hour to the hour.
  hour++;
  //$("#end_date").val = start;
  $("#end_date").val(""+date+"T"+hour+":"+minute+"");

Đầu ra của bạn sẽ là: 2019-04-03T16: 58

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.