Làm cách nào để thêm 30 phút vào đối tượng Ngày JavaScript?


785

Tôi muốn nhận một đối tượng Ngày muộn hơn 30 phút so với đối tượng Ngày khác. Làm cách nào để làm điều đó với JavaScript?


1
Tôi đã xây dựng một tập lệnh bật lên lịch nhỏ trong js, trên Github , có thể xem qua mã để xem đối tượng ngày được xen vào như thế nào. Ngoài ra, hãy kiểm tra Javascript Kit vì nó là một tài liệu tham khảo js tuyệt vời, đặc biệt là đối tượng ngày.
Christian

2
Tất cả các câu trả lời dưới đây sử dụng một biến thể date.setMinutes(date.getMinutes() + ...)sẽ không vượt qua ranh giới Tiết kiệm ánh sáng ban ngày. Ví dụ: (giả sử '2014 / 03-09' là ranh giới Tiết kiệm ánh sáng ban ngày): var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); dbây giờ sớm hơn 30 phút, không muộn hơn f.
Spig

1
@Spig: 30 phút sau 1:59 AM trên ranh giới DST là 1:29 AM. Không có lỗi. Nếu bạn in fd, bạn sẽ thấy một người nói "GMT-0500", người kia nói "GMT-0400" (hoặc bất kể múi giờ của bạn là gì). Ngoài ra, nếu bạn gọi .getTime()cả hai fd, bạn sẽ thấy số tiền đó flớn hơn d(tức là sau này).
Kip

1
@Spig: thú vị, đã thử nó trên Firefox và nó đã hoạt động. Tôi nghĩ rằng nó rơi vào một vùng màu xám trong đặc tả về cách getMinutes () hoạt động. 01:89sẽ trở thành 02:29, thứ không tồn tại vào ngày bạn "hồi xuân". Chrome quyết định điều đó nên 01:29, FF quyết định 03:29. Vào buổi tối khi bạn "ngã ngửa", cả hai trình duyệt đều bỏ qua giờ "rơi lại" và nhảy về phía trước 90 phút, để 02:29. Dưới đây là một số bản demo của JSFiddle: "mùa xuân về phía trước" / "quay trở lại"
Kip

1
Nếu một trong những câu trả lời dưới đây trả lời câu hỏi của bạn, cách trang web này hoạt động, bạn sẽ "chấp nhận" câu trả lời, ở đây: Tôi nên làm gì khi ai đó trả lời câu hỏi của tôi? . Nhưng chỉ khi câu hỏi của bạn thực sự đã được trả lời. Nếu không, hãy xem xét thêm chi tiết cho câu hỏi.
Tạm biệt StackExchange

Câu trả lời:


951

Sử dụng thư viện

Nếu bạn đang làm nhiều công việc hẹn hò, bạn có thể muốn xem xét các thư viện ngày JavaScript như Datejs hoặc Moment.js . Ví dụ: với Moment.js, điều này chỉ đơn giản là:

var newDateObj = moment(oldDateObj).add(30, 'm').toDate();

Vani Javascript

Đây giống như câu trả lời của sự hỗn loạn , nhưng trong một dòng:

var newDateObj = new Date(oldDateObj.getTime() + diff*60000);

Đâu difflà sự khác biệt về số phút bạn muốn từ oldDateObjthời gian. Nó thậm chí có thể là tiêu cực.

Hoặc là một chức năng có thể sử dụng lại, nếu bạn cần làm điều này ở nhiều nơi:

function addMinutes(date, minutes) {
    return new Date(date.getTime() + minutes*60000);
}

Và chỉ trong trường hợp điều này không rõ ràng, lý do chúng tôi nhân số phút 60000là để chuyển đổi phút thành mili giây.

Hãy cẩn thận với Vanilla Javascript. Ngày tháng thật khó!

Bạn có thể nghĩ rằng bạn có thể thêm 24 giờ vào một ngày để có được ngày mai, phải không? Sai lầm!

addMinutes(myDate, 60*24); //DO NOT DO THIS

Hóa ra, nếu người dùng quan sát thời gian tiết kiệm ánh sáng ban ngày, một ngày không nhất thiết phải dài 24 giờ. Có một ngày một năm chỉ dài 23 giờ, và một ngày một năm dài 25 giờ. Ví dụ: ở hầu hết Hoa Kỳ và Canada, 24 giờ sau nửa đêm, ngày 2 tháng 11 năm 2014, vẫn là ngày 2 tháng 11:

const NOV = 10; //because JS months are off by one...
addMinutes(new Date(2014, NOV, 2), 60*24); //In USA, prints 11pm on Nov 2, not 12am Nov 3!

Đây là lý do tại sao sử dụng một trong những thư viện được đề cập ở trên là đặt cược an toàn hơn nếu bạn phải thực hiện nhiều công việc với điều này.

Dưới đây là một phiên bản chung hơn của chức năng này mà tôi đã viết. Tôi vẫn khuyên bạn nên sử dụng thư viện, nhưng điều đó có thể là quá mức / không thể đối với dự án của bạn. Cú pháp được mô hình hóa sau hàm MySQL DATE_ADD .

/**
 * Adds time to a date. Modelled after MySQL DATE_ADD function.
 * Example: dateAdd(new Date(), 'minute', 30)  //returns 30 minutes from now.
 * https://stackoverflow.com/a/1214753/18511
 * 
 * @param date  Date to start with
 * @param interval  One of: year, quarter, month, week, day, hour, minute, second
 * @param units  Number of units of the given interval to add.
 */
function dateAdd(date, interval, units) {
  if(!(date instanceof Date))
    return undefined;
  var ret = new Date(date); //don't change original date
  var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};
  switch(String(interval).toLowerCase()) {
    case 'year'   :  ret.setFullYear(ret.getFullYear() + units); checkRollover();  break;
    case 'quarter':  ret.setMonth(ret.getMonth() + 3*units); checkRollover();  break;
    case 'month'  :  ret.setMonth(ret.getMonth() + units); checkRollover();  break;
    case 'week'   :  ret.setDate(ret.getDate() + 7*units);  break;
    case 'day'    :  ret.setDate(ret.getDate() + units);  break;
    case 'hour'   :  ret.setTime(ret.getTime() + units*3600000);  break;
    case 'minute' :  ret.setTime(ret.getTime() + units*60000);  break;
    case 'second' :  ret.setTime(ret.getTime() + units*1000);  break;
    default       :  ret = undefined;  break;
  }
  return ret;
}

Làm việc demo jsFiddle .


14
Điều này rất mạnh mẽ; Nó hoạt động trong bất kỳ số phút nào ngay cả khi số âm.
Wahid Bitar

3
Trong vài giây, nhân với 1000 thay vì 60k.
tro999

2
Hàm dateAdd () rất tuyệt! Nhưng có một lưu ý từ tôi - về mặt ngữ nghĩa, đơn vị nên là "phút", "giây", v.v. và khoảng thời gian nên là số tiền (2, 10, 45, ...), chứ không phải ngược lại. Nếu không thì ý tưởng là tốt.
Vasil Popov

1
Câu trả lời này không phù hợp với tháng cuộn, vì vậy ngày 31 tháng 1 cộng với một tháng sẽ cho 2 hoặc 3 tháng 3 tùy thuộc vào việc đó có phải là năm nhuận hay không. Các hàm addMonthsaddYears trong câu trả lời của Jacobi đối với điều đó đối với tôi, đó là một câu trả lời tốt hơn.
RobG

1
@RobG Điểm tốt. Tôi đã thêm một bản sửa lỗi cho điều này và nhấn mạnh thêm vào điểm "sử dụng thư viện nếu có thể".
Kip

238
var d1 = new Date ();
var d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );

114
@Jamie: Bạn không cần hai Dateđối tượng. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner

15
@Grant: Tôi giả sử d2 = "Tôi muốn lấy một đối tượng Ngày" và d1 = "đến một đối tượng Ngày khác"
Jamie

7
@CKeene, setMinutes & getMinutes là một phần của Javascript cũ đơn giản (mặc dù datejs cung cấp rất nhiều thứ khác).
s29

4
FYI- điều này có thể vượt qua ranh giới Giờ tiết kiệm ánh sáng ban ngày. Bản trình diễn của JSFiddle: "mùa xuân tiến" / "quay lại" (Cảm ơn @Spig vì điều này)
Kip

@trevorgrayson Nếu một tham số bạn chỉ định nằm ngoài phạm vi dự kiến, setMinutes () sẽ cố gắng cập nhật thông tin ngày cho phù hợp. Ví dụ: nếu bạn sử dụng 100, số giờ sẽ được tăng thêm 1 và 40 sẽ được sử dụng trong vài phút.
Mihai Crăiță

155

var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);


3
Lưu ý rằng setTimetrả về dấu thời gian mili giây, không phải là đối tượng ngày. (Đừng nghĩ rằng bạn có thể thực hiện một lớp lót.)
Alan H.

12
var in30Mins = new Date(+new Date() + 1.8e6)là một lớp lót một, nhưng không chắc nó tốt hơn lớp lót hai. ;-)
RobG

112

var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);


9
Thông báo tôi đã đăng một bản sao này. Đã xóa và thay vào đó là 1'd.
Izzy

3
câu trả lời đơn giản nhất cho câu hỏi này
vijay

Tôi nghĩ setMinutestrả về dấu thời gian, nhưng nowvẫn là Dateđối tượng, vì vậy now = new Date(now)đã lỗi thời
p.boiko

46

Có lẽ một cái gì đó như thế này?

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

console.log(v)


6
@ Chacha102: Bạn không cần hai Dateđối tượng. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner

12
Anh muốn hai đối tượng hẹn hò. Đọc câu hỏi. Đối tượng Một ngày trước 30 phút so với đối tượng ngày khác.
Tyler Carter

5
Điều này có ổn không nếu nó lặp lại quá giờ? Vì vậy, nếu tôi gọi nó vào lúc 11:59, nó có lịch trình vào lúc 12:29 không?
Chris Rae

1
@ChrisRae vâng, đúng vậy. If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
fridoo

35

Tôi luôn tạo 7 hàm, để làm việc với ngày trong JS: addSeconds, addMinutes, addHours, addDays, addWeek, addMonths, addYears.

Bạn có thể xem một ví dụ ở đây: http://jsfiddle.net/tiagoajacobi/YHA8x/

Cách sử dụng:

var now = new Date();
console.log(now.addMinutes(30));
console.log(now.addWeeks(3));

Đây là các chức năng:

        Date.prototype.addSeconds = function(seconds) {
            this.setSeconds(this.getSeconds() + seconds);
            return this;
        };

        Date.prototype.addMinutes = function(minutes) {
            this.setMinutes(this.getMinutes() + minutes);
            return this;
        };

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

        Date.prototype.addDays = function(days) {
            this.setDate(this.getDate() + days);
            return this;
        };

        Date.prototype.addWeeks = function(weeks) {
            this.addDays(weeks*7);
            return this;
        };

        Date.prototype.addMonths = function (months) {
            var dt = this.getDate();

            this.setMonth(this.getMonth() + months);
            var currDt = this.getDate();

            if (dt !== currDt) {  
                this.addDays(-currDt);
            }

            return this;
        };

        Date.prototype.addYears = function(years) {
            var dt = this.getDate();

            this.setFullYear(this.getFullYear() + years);

            var currDt = this.getDate();

            if (dt !== currDt) {  
                this.addDays(-currDt);
            }

            return this;
        };

Bất cứ ai cũng có thể thấy bất kỳ vấn đề với phương pháp này?
Dembinski

1
thay vào đó hãy sử dụng khoảnh khắc.js
Victor Pudeyev

@ TheDembinski, bạn đang mong đợi vấn đề gì? Việc mở rộng các phần dựng sẵn thường không thích, nhưng tôi không thể thấy vấn đề với Ngày. Sẽ thật tuyệt nếu mỗi gia số chính cũng tùy ý đặt các mức tăng nhỏ của nó (như các phương thức * đã làm), vì vậy addHours tùy ý mất vài phút, giây và mili giây để bạn có thể làm date.addHours(3, 30)thêm 3 giờ và 30 phút. addYears sẽ mất nhiều năm, tháng và ngày, addMonths sẽ mất hàng tháng và ngày, addMinutes sẽ mất vài phút, giây, mili giây, v.v.
RobG

1
Xin chào @transformer Tôi sẽ làm một cái gì đó như thế này new Date().addHours(4).addMinutes(45);Bạn có thể gọi bao nhiêu tùy ý, vì các phương thức trả về "cái này" là Đối tượng Ngày hiện tại.
Jacobi

1
Xin chào @transformer, tôi không chắc tôi đã hiểu vấn đề của bạn, nhưng đây là chức năng nguyên mẫu, bạn có thể sử dụng theo bất kỳ thứ tự nào bạn muốn, ví dụ: var dt = new Date();sau đó dt.addMinutes(45); dt.addHours(4);hoặc thậm chí dt.addMinutes(285);hoặc dt.addMinutes(45).addHours(4);tất cả sẽ hoạt động. Nếu bạn có một câu hỏi với một số ví dụ về mã, đối với vấn đề của bạn, hãy đăng nó ở đây tôi sẽ sẵn lòng giúp bạn.
Jacobi

13

Cách dễ nhất để giải quyết là nhận ra rằng trong các ngày javascript chỉ là những con số. Nó bắt đầu 0hoặc 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST). Mỗi 1đại diện cho một phần nghìn giây. Bạn có thể thêm hoặc trừ một phần nghìn giây bằng cách nhận giá trị và bắt đầu một ngày mới bằng cách sử dụng giá trị đó. Bạn có thể quản lý nó khá dễ dàng với tâm trí đó.

const minutesToAdjust = 10;
const millisecondsPerMinute = 60000;
const originalDate = new Date('11/20/2017 10:00 AM');
const modifiedDate1 = new Date(originalDate.valueOf() - (minutesToAdjust * millisecondsPerMinute));
const modifiedDate2 = new Date(originalDate.valueOf() + (minutesToAdjust * millisecondsPerMinute));

console.log(originalDate); // Mon Nov 20 2017 10:00:00 GMT-0600 (CST)
console.log(modifiedDate1); // Mon Nov 20 2017 09:50:00 GMT-0600 (CST)
console.log(modifiedDate2); // Mon Nov 20 2017 10:10:00 GMT-0600 (CST)

10

Đây là những gì tôi làm có vẻ hoạt động khá tốt:

Date.prototype.addMinutes = function(minutes) {
    var copiedDate = new Date(this.getTime());
    return new Date(copiedDate.getTime() + minutes * 60000);
}

Sau đó, bạn có thể gọi như thế này:

var now = new Date();
console.log(now.addMinutes(50));

2
Bạn chỉ có thể làm return new Date(this.getTime() + minutes * 60000);, tôi không cần sao chép tạm thời . ;-)
RobG

5

Đây là phiên bản ES6 :

let getTimeAfter30Mins = () => {
  let timeAfter30Mins = new Date();
  timeAfter30Mins = new Date(timeAfter30Mins.setMinutes(timeAfter30Mins.getMinutes() + 30));
};

Gọi nó như:

getTimeAfter30Mins();

Tôi có người dùng nhập 4:30 giờ + 2:15 giờ / phút, làm cách nào tôi có thể cho phép người dùng vượt qua giờ và phút và thêm nó vào một giờ hiện tại.
máy biến áp

@transformer bạn có thể cung cấp các trường đầu vào khác nhau trong nhiều giờ, vài phút và cứ thế xác thực số.
xameeramir

5

Tôi cảm thấy nhiều câu trả lời ở đây đang thiếu một thành phần sáng tạo, rất cần thiết cho các tính toán du hành thời gian. Tôi trình bày giải pháp của mình cho một bản dịch tạm thời trong 30 phút.

(jsfiddle ở đây )

function fluxCapacitor(n) {
    var delta,sigma=0,beta="ge";
    (function(K,z){

        (function(a,b,c){
            beta=beta+"tT";
            switch(b.shift()) {
                case'3':return z('0',a,c,b.shift(),1);
                case'0':return z('3',a,c,b.pop());
                case'5':return z('2',a,c,b[0],1);
                case'1':return z('4',a,c,b.shift());
                case'2':return z('5',a,c,b.pop());
                case'4':return z('1',a,c,b.pop(),1);
            }
        })(K.pop(),K.pop().split(''),K.pop());
    })(n.toString().split(':'),function(b,a,c,b1,gamma){
       delta=[c,b+b1,a];sigma+=gamma?3600000:0; 
       beta=beta+"im";
    });
    beta=beta+"e";
    return new Date (sigma+(new Date( delta.join(':')))[beta]());
}

Tôi phải thừa nhận đây là sáng tạo. Nhưng người đàn ông .. Điều này thật khó đọc!
Erik Baan

2

Dành cho những kẻ lười biếng như mình:

Câu trả lời của Kip (từ phía trên) trong coffeescript, sử dụng "enum" và hoạt động trên cùng một đối tượng:

Date.UNIT =
  YEAR: 0
  QUARTER: 1
  MONTH: 2
  WEEK: 3
  DAY: 4
  HOUR: 5
  MINUTE: 6
  SECOND: 7
Date::add = (unit, quantity) ->
  switch unit
    when Date.UNIT.YEAR then @setFullYear(@getFullYear() + quantity)
    when Date.UNIT.QUARTER then @setMonth(@getMonth() + (3 * quantity))
    when Date.UNIT.MONTH then @setMonth(@getMonth() + quantity)
    when Date.UNIT.WEEK then @setDate(@getDate() + (7 * quantity))
    when Date.UNIT.DAY then @setDate(@getDate() + quantity)
    when Date.UNIT.HOUR then @setTime(@getTime() + (3600000 * quantity))
    when Date.UNIT.MINUTE then @setTime(@getTime() + (60000 * quantity))
    when Date.UNIT.SECOND then @setTime(@getTime() + (1000 * quantity))
    else throw new Error "Unrecognized unit provided"
  @ # for chaining

2

Sử dụng một thư viện hiện có được biết để xử lý các quirks liên quan đến việc xử lý các tính toán thời gian. Yêu thích hiện tại của tôi là khoảnh khắc .

<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js"></script>
<script>
 var now = moment(); // get "now"
 console.log(now.toDate()); // show original date
 var thirty = moment(now).add(30,"minutes"); // clone "now" object and add 30 minutes, taking into account weirdness like crossing DST boundries or leap-days, -minutes, -seconds.
 console.log(thirty.toDate()); // show new date
</script>

3
Câu trả lời không thể cải thiện nếu bạn downvote mà không đưa ra lý do.
Ouroborus

OP yêu cầu một giải pháp JavaScript, không phải khung / thư viện.
mattpark22

2
@ mattpark22 Trong khi tôi hiểu những gì bạn đang nhận được, một thư viện javascript vẫn là javascript. Tôi có thể tách ra chỉ là những phần có liên quan của thư viện và trình bày chúng như một giải pháp mã. OP sẽ có một câu trả lời là javascript, theo nghĩa mà bạn muốn nói, nhưng sẽ không biết về một giải pháp mục đích chung (có thể) chấp nhận được. Ngoài ra, việc thêm 30 phút gần như không tầm thường vì hầu hết các câu trả lời đều có âm thanh, vì có rất nhiều trường hợp cạnh không được xử lý bởi đối tượng Date. Ví dụ: câu trả lời phổ biến nhất bị phá vỡ khi vượt qua ranh giới DST.
Ouroborus

@ Thư viện của chúng tôi không nên là giải pháp duy nhất được cung cấp nếu OP không yêu cầu thư viện trong OP hoặc thẻ. Mặt khác, các câu trả lời có thể trở thành một cách đơn giản để làm một cái gì đó trong các thư viện khác nhau và OP không còn khôn ngoan hơn đối với vấn đề thực tế của họ (trong trường hợp này là khá đơn giản để giải quyết).
RobG

1
@RobG Không ai đề xuất rằng chỉ nên cung cấp giải pháp thư viện. OP đặc biệt không thể yêu cầu một thư viện vì điều đó sẽ khiến câu hỏi bị lạc đề. Hỏi "Làm thế nào để tôi làm điều đó với JavaScript?" có thể được hiểu là xác định rằng điều này là cụ thể đối với javascript (yêu cầu giải pháp bằng một ngôn ngữ cụ thể trái ngược với yêu cầu giải pháp mã thô) đặc biệt là chi tiết này được lặp lại trong tiêu đề và các thẻ.
Ouroborus

1

Chỉ là một lựa chọn khác, mà tôi đã viết:

Thư viện DP_DateExtensions

Sẽ là quá mức nếu đây là tất cả các xử lý ngày mà bạn cần, nhưng nó sẽ làm những gì bạn muốn.

Hỗ trợ định dạng ngày / giờ, toán ngày (cộng / trừ các phần ngày), so sánh ngày, phân tích ngày, v.v ... Nó tự do mở nguồn.


1

Bạn có thể làm điều này:

let thirtyMinutes = 30 * 60 * 1000; // convert 30 minutes to milliseconds
let date1 = new Date();
let date2 = new Date(date1.getTime() + thirtyMinutes);
console.log(date1);
console.log(date2);



1

Bạn sẽ nhận được giá trị của ngày hiện tại để lấy ngày bằng (ms) và thêm (30 * 60 * 1000) vào ngày đó. Bây giờ bạn có (ngày hiện tại + 30 phút) với ms

console.log('with ms', Date.now() + (30 * 60 * 1000))
console.log('new Date', new Date(Date.now() + (30 * 60 * 1000)))


0

Tôi biết rằng chủ đề này là quá cũ. Nhưng tôi khá chắc chắn rằng có một số nhà phát triển vẫn cần điều này, vì vậy tôi đã tạo ra kịch bản đơn giản này cho bạn. Tôi hy vọng bạn thích nó!

function strtotime(date, addTime){
  let generatedTime=date.getTime();
  if(addTime.seconds) generatedTime+=1000*addTime.seconds; //check for additional seconds 
  if(addTime.minutes) generatedTime+=1000*60*addTime.minutes;//check for additional minutes 
  if(addTime.hours) generatedTime+=1000*60*60*addTime.hours;//check for additional hours 
  return new Date(generatedTime);
}

let futureDate = strtotime(new Date(), {
    hours: 1, //Adding one hour
    minutes: 45, //Adding fourty five minutes
    seconds: 0 //Adding 0 seconds return to not adding any second so  we can remove it.
});
<button onclick="alert(futureDate)">Travel to the future</button>

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.