Bagaimana cara menambahkan 30 menit ke objek Tanggal JavaScript?

785

Saya ingin mendapatkan objek Date yang 30 menit lebih lambat dari objek Date lainnya. Bagaimana saya melakukannya dengan JavaScript?

Morgan Cheng
sumber
1
Saya membuat skrip popup kalender kecil di js, yang ada di Github , mungkin memeriksa kode untuk melihat bagaimana objek tanggal berinteraksi. Juga, periksa Javascript Kit sebagai referensi js yang mengagumkan, terutama untuk objek tanggal.
Christian
2
Semua jawaban di bawah ini yang menggunakan variasi date.setMinutes(date.getMinutes() + ...)akan gagal melintasi batas Daylight Saving. Misalnya (dengan asumsi '2014-03-09' adalah batas Daylight Saving): var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); dsekarang 30 menit lebih awal, tidak lebih lambat dari f.
Spig
1
@Spig: 30 menit setelah 01:59 pada batas DST adalah 1:29 Tidak ada kesalahan. Jika Anda mencetak fdan d, Anda akan melihat yang satu mengatakan "GMT-0500" yang lain mengatakan "GMT-0400" (atau apa pun zona waktu Anda). Juga, jika Anda memanggil .getTime()keduanya fdan d, Anda akan melihat bahwa flebih besar dari d(yaitu nanti).
Kip
1
@Spig: menarik, mencobanya di Firefox dan berhasil. Saya pikir itu jatuh ke area abu-abu dalam spesifikasi bagaimana getMinutes () seharusnya bekerja. 01:89akan menjadi 02:29, yang tidak ada pada hari Anda "maju". Chrome memutuskan itu seharusnya 01:29, FF memutuskan 03:29. Pada malam ketika Anda "mundur", kedua browser melewatkan jam "mundur" dan melompat ke depan selama 90 menit, untuk 02:29. Berikut ini beberapa demo JSFiddle: "maju ke depan" / "mundur"
Kip
1
Jika salah satu jawaban di bawah menjawab pertanyaan Anda, cara kerja situs ini, Anda akan "menerima" jawabannya, lebih lanjut di sini: Apa yang harus saya lakukan ketika seseorang menjawab pertanyaan saya? . Tetapi hanya jika pertanyaan Anda benar-benar telah dijawab. Jika tidak, pertimbangkan untuk menambahkan detail lebih lanjut ke pertanyaan.
Selamat tinggal StackExchange

Jawaban:

951

Menggunakan Perpustakaan

Jika Anda melakukan banyak pekerjaan kencan, Anda mungkin ingin melihat perpustakaan tanggal JavaScript seperti Datejs atau Moment.js . Misalnya, dengan Moment.js, ini hanyalah:

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

Vanilla Javascript

Ini seperti jawaban kekacauan , tetapi dalam satu baris:

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

Di mana diffperbedaan dalam menit yang Anda inginkan dari oldDateObjwaktu. Bahkan bisa negatif.

Atau sebagai fungsi yang dapat digunakan kembali, jika Anda perlu melakukan ini di banyak tempat:

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

Dan kalau-kalau ini tidak jelas, alasan kami melipatgandakan menit 60000adalah untuk mengubah menit menjadi milidetik.

Hati-hati dengan Vanilla Javascript. Tanggal Itu Sulit!

Anda mungkin berpikir Anda dapat menambahkan 24 jam ke tanggal untuk mendapatkan tanggal besok, bukan? Salah!

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

Ternyata, jika pengguna mengamati waktu musim panas, sehari belum tentu 24 jam. Ada satu hari setahun yang panjangnya hanya 23 jam, dan satu hari setahun yang panjangnya 25 jam. Misalnya, di sebagian besar Amerika Serikat dan Kanada, 24 jam setelah tengah malam, 2 November 2014, masih 2 November:

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!

Inilah sebabnya mengapa menggunakan salah satu perpustakaan yang disebutkan sebelumnya adalah taruhan yang lebih aman jika Anda harus melakukan banyak pekerjaan dengan ini.

Di bawah ini adalah versi yang lebih umum dari fungsi ini yang saya tulis. Saya masih merekomendasikan menggunakan perpustakaan, tetapi itu mungkin berlebihan / tidak mungkin untuk proyek Anda. Sintaks dimodelkan setelah fungsi 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;
}

Demo jsFiddle bekerja .

Tidur
sumber
14
Ini sangat kuat; Ia bekerja untuk jumlah menit berapa pun meskipun jumlahnya negatif.
Wahid Bitar
3
Untuk detik, kalikan dengan 1000, bukan 60k.
ashes999
2
Fungsi dateAdd () hebat! Tetapi ada satu catatan dari saya - semantik, unit harus "menit", "kedua", dll. Dan interval harus menjadi jumlah (2, 10, 45, ...), bukan sebaliknya. Kalau tidak idenya bagus.
Vasil Popov
1
Jawaban ini gagal mengakomodasi overs roll bulan, jadi 31 Jan plus satu bulan memberikan 2 atau 3 Mar tergantung pada apakah itu tahun kabisat atau tidak. Fungsi addMonths dan addYears dalam jawaban Jacobi, jadi bagi saya, itu jawaban yang lebih baik.
RobG
1
@RobG Poin bagus. Saya telah menambahkan perbaikan untuk ini dan lebih menekankan titik "gunakan perpustakaan jika mungkin".
Kip
238
var d1 = new Date ();
var d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
Jamie
sumber
114
@ Jamie: Anda tidak perlu dua Dateobjek. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner
15
@Grant: Saya berasumsi d2 = "Saya ingin mendapatkan objek Date" dan d1 = "ke objek Date lain"
Jamie.
7
@CKeene, setMinutes & getMinutes adalah bagian dari Javascript lama biasa (meskipun datejs memang menyediakan banyak hal lainnya).
s29
4
FYI- ini dapat menembus batas Waktu Hemat Siang Hari. Demo JSFiddle: "spring forward" / "fall back" (Terima kasih @Spig untuk ini)
Kip
@trevorgrayson Jika parameter yang Anda tentukan berada di luar kisaran yang diharapkan, setMinutes () mencoba memperbarui informasi tanggal yang sesuai. Misalnya, jika Anda menggunakan 100, jam akan bertambah 1 dan 40 akan digunakan selama beberapa menit.
Mihai Crăiță
155

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

kekacauan
sumber
3
Perhatikan bahwa setTimemengembalikan cap waktu milidetik numerik, bukan objek tanggal. (Jangan pikir Anda bisa melakukan one-liner.)
Alan H.
12
var in30Mins = new Date(+new Date() + 1.8e6)adalah liner satu, tetapi tidak yakin itu lebih baik dari liner dua. ;-)
RobG
112

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

Teo Graca
sumber
9
Melihat saya memposting duplikat ini. Dihapus dan diberi +1 sebagai gantinya.
Izzy
3
jawaban paling sederhana untuk pertanyaan ini
vijay
Saya pikir setMinutesmengembalikan stempel waktu, tetapi nowtetap menjadi Dateobjek, jadi now = new Date(now)usang
p.boiko
46

Mungkin kira-kira seperti ini?

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

console.log(v)

Tyler Carter
sumber
6
@ Chacha102: Anda tidak perlu dua Dateobjek. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner
12
Dia ingin dua objek kencan. Baca Pertanyaannya. Satu objek Date yang berjarak 30 menit dari objek date lainnya.
Tyler Carter
5
Apakah ini berhasil jika loop melewati jam? Jadi jika saya menyebutnya pukul 11:59, apakah itu menjadwalkan ok di 12:29?
Chris Rae
1
@ ChrisRae ya, benar. 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

Saya selalu membuat 7 fungsi, untuk bekerja dengan tanggal di JS: addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.

Anda dapat melihat contoh di sini: http://jsfiddle.net/tiagoajacobi/YHA8x/

Cara Penggunaan:

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

Ini fungsinya:

        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;
        };
Jacobi
sumber
Adakah yang bisa melihat masalah dengan pendekatan ini?
The Dembinski
1
gunakan moment.js sebagai gantinya
Victor Pudeyev
@ TheDembinski — masalah apa yang Anda harapkan? Memperluas built-in umumnya tidak disukai, tapi saya tidak bisa melihat masalah dengan Date. Akan lebih baik jika setiap kenaikan besar juga secara opsional mengatur kenaikan kecilnya (seperti metode set * lakukan), jadi addHour secara opsional mengambil menit, detik, dan milidetik sehingga Anda bisa date.addHours(3, 30)menambahkan 3 jam dan 30 menit. addYears akan membutuhkan waktu bertahun-tahun, berbulan-bulan dan berhari-hari, addMonth akan membutuhkan waktu berbulan-bulan, berhari-hari AddMinutes akan memakan waktu beberapa menit, detik, milidetik, dll.
RobG
1
Hai @ transformer Saya akan melakukan sesuatu seperti ini new Date().addHours(4).addMinutes(45);Anda dapat memanggil sebanyak yang Anda inginkan, karena metode mengembalikan "ini" yang merupakan Objek Tanggal saat ini.
Jacobi
1
Hai @ transformer, saya tidak yakin saya mengerti masalah Anda, tetapi ini adalah fungsi prototipe, Anda dapat menggunakan dalam urutan apa pun yang Anda inginkan, mis: var dt = new Date();lalu dt.addMinutes(45); dt.addHours(4);atau bahkan dt.addMinutes(285);atau juga dt.addMinutes(45).addHours(4);semua akan bekerja. Jika Anda memiliki pertanyaan dengan beberapa contoh kode, untuk masalah Anda posting di sini saya akan dengan senang hati membantu Anda.
Jacobi
13

Cara termudah untuk menyelesaikannya adalah dengan mengenali bahwa pada tanggal javascript hanya angka. Itu dimulai 0atau 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST). Setiap 1mewakili satu milidetik. Anda dapat menambah atau mengurangi milidetik dengan mendapatkan nilai dan membuat tanggal baru menggunakan nilai itu. Anda dapat mengaturnya dengan mudah dengan pikiran itu.

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)
tsacodes
sumber
10

Inilah yang saya lakukan yang tampaknya bekerja dengan cukup baik:

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

Maka Anda bisa memanggil ini seperti ini:

var now = new Date();
console.log(now.addMinutes(50));
Jonathan
sumber
2
Anda bisa melakukannya return new Date(this.getTime() + minutes * 60000);, saya copyDate sementara tidak diperlukan. ;-)
RobG
5

Ini adalah versi ES6 :

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

Sebut saja seperti:

getTimeAfter30Mins();
xameeramir
sumber
Saya memiliki pengguna memasukkan jam 4:30 + 2:15 jam / menit, bagaimana saya bisa membiarkan pengguna melewati jam dan menit dan menambahkannya ke jam yang ada menit.
transformator
@ transformer Anda dapat memberikan bidang input yang berbeda selama berjam-jam, menit, dan seterusnya memiliki validasi angka.
xameeramir
5

Saya merasa banyak jawaban di sini tidak memiliki komponen kreatif, sangat dibutuhkan untuk perhitungan perjalanan waktu. Saya menyajikan solusi saya untuk terjemahan temporal 30 menit.

(jsfiddle di sini )

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]());
}
tidak disinkronkan
sumber
Saya harus mengakui ini kreatif. Tapi kawan .. Ini sulit dibaca!
Erik Baan
2

Untuk yang malas seperti saya:

Jawaban Kip (dari atas) dalam coffeescript, menggunakan "enum", dan beroperasi pada objek yang sama:

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
Blaskovicz
sumber
2

Gunakan perpustakaan yang ada yang dikenal untuk menangani kebiasaan yang terlibat dalam berurusan dengan perhitungan waktu. Favorit saya saat ini adalah moment.js .

<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>
Ouroborus
sumber
3
Jawaban tidak dapat ditingkatkan jika Anda downvote tanpa memberikan alasan.
Ouroborus
OP meminta solusi JavaScript, bukan kerangka / pustaka.
mattpark22
2
@ mattpark22 Sementara saya mengerti apa yang Anda maksud, perpustakaan javascript masih javascript. Saya bisa merobek hanya potongan-potongan yang relevan dari perpustakaan dan menyajikannya sebagai solusi kode. OP akan memiliki jawaban yang javascript, dalam arti bahwa Anda bersungguh-sungguh, tetapi tidak mengetahui solusi tujuan umum yang mungkin diterima. Juga, menambahkan 30 menit hampir tidak sepele karena sebagian besar jawaban membuatnya terdengar, karena ada banyak kasus tepi yang tidak ditangani oleh objek Date. Misalnya, jawaban paling populer dipatahkan ketika melewati batas DST.
Ouroborus
@ Ouroborus — perpustakaan tidak boleh menjadi satu-satunya solusi yang disediakan jika OP belum meminta perpustakaan di OP atau tag. Kalau tidak, jawaban bisa menjadi hanya litani cara untuk melakukan sesuatu di perpustakaan yang berbeda dan OP dibiarkan tidak bijaksana dengan masalah mereka yang sebenarnya (yang dalam hal ini cukup sepele untuk dipecahkan).
RobG
1
@RobG Tidak ada yang menyarankan bahwa hanya solusi perpustakaan yang harus disediakan. OP tidak dapat secara khusus meminta perpustakaan karena itu akan menyebabkan pertanyaan menjadi di luar topik. Bertanya "Bagaimana saya melakukannya dengan JavaScript?" dapat ditafsirkan sebagai menetapkan bahwa ini khusus untuk javascript (meminta solusi dalam bahasa tertentu sebagai lawan meminta solusi kode mentah) terutama mengingat detail ini diulang dalam judul dan tag.
Ouroborus
1

Hanya pilihan lain, yang saya tulis:

Perpustakaan DP_DateExtensions

Ini berlebihan jika ini semua pengolahan tanggal yang Anda butuhkan, tetapi itu akan melakukan apa yang Anda inginkan.

Mendukung pemformatan tanggal / waktu, matematika tanggal (menambah / mengurangi bagian tanggal), membandingkan tanggal, penguraian tanggal, dll. Ini bersumber terbuka secara bebas.

Jim Davis
sumber
1

Anda bisa melakukan ini:

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);

rayalois22
sumber
1

Ini satu-liner saya:

console.log('time: ', new Date(new Date().valueOf() + 60000))

Jason Mullings
sumber
1

Anda harus mendapatkan nilai tanggal saat ini untuk mendapatkan tanggal dengan (ms) dan menambahkan (30 * 60 * 1000) ke dalamnya. Sekarang Anda memiliki (tanggal saat ini + 30 menit) dengan ms

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

Abdulrahman Fawzy
sumber
0

Saya tahu bahwa topiknya terlalu lama. Tetapi saya cukup yakin bahwa ada beberapa pengembang yang masih membutuhkan ini, jadi saya membuat skrip sederhana ini untuk Anda. Kuharap kamu menikmatinya!

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>

Adnane Ar
sumber