Bagaimana cara mengurangi menit dari tanggal dalam javascript?

133

Bagaimana saya bisa menerjemahkan kode pseudo ini ke dalam js yang berfungsi [jangan khawatir tentang dari mana tanggal akhir berasal kecuali bahwa itu adalah tanggal javascript yang valid].

var myEndDateTime = somedate;  //somedate is a valid js date  
var durationInMinutes = 100; //this can be any number of minutes from 1-7200 (5 days)

//this is the calculation I don't know how to do
var myStartDate = somedate - durationInMuntes;

alert("The event will start on " + myStartDate.toDateString() + " at " + myStartDate.toTimeString());
brendan
sumber

Jawaban:

199

Setelah Anda mengetahui hal ini:

  • Anda dapat membuat Datedengan memanggil konstruktor dengan milidetik sejak 1 Januari 1970.
  • The valueOf()a Dateadalah jumlah milidetik sejak Jan 1, 1970
  • Ada 60,000milidetik dalam satu menit: -]

... tidak terlalu sulit.

Dalam kode di bawah ini, yang baru Datedibuat dengan mengurangi jumlah milidetik dari myEndDateTime:

var MS_PER_MINUTE = 60000;
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE);
Daniel LeCheminant
sumber
6
Tetapi tidak menangani ketika Anda menambahkan menit. Untuk menangani dengan benar saat Anda menambahkan menit, Anda harus menggunakan .getTime(). Contoh:var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
Gabriel L. Oliveira
Anda juga dapat menggunakan var myStartDate = somedate.addMinutes(-durationInMuntes);Saya berasumsi bahwa suatu hari adalah objek Date
kubahaha
1
Ini berfungsi ... tetapi ada pertanyaan bahwa konstruktor Date () memiliki 3 opsi, yaitu 1: kosong 2: string dan 3: Angka tahun, Angka Bulan .... jadi yang digunakan di atas mengikuti konstruktor mana?
Zafar
3
Lebih banyak programmer kepalsuan percaya tentang waktu, # 32 "Ada 60 detik setiap menit."
Niet the Dark Absol
Untuk contoh bagaimana ini bisa salah, menggunakan Eropa / London sebagai lokal zona waktu: var d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);Anda harapkan euntuk menjadi 02:10:00, kan? Nggak. 01:10:00. DST bilang hai. Dan kemudian ada lompatan detik ...
Niet the Dark Absol
81

Anda juga dapat menggunakan get dan atur menit untuk mencapainya:

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

startdate.setMinutes(endDate.getMinutes() - durationInMinutes);
Miquel
sumber
52
Perlu dicatat bahwa setMinutes()cukup pintar untuk menangani menit negatif dengan benar. Jadi, jika tanggal mulai 03:05, dan Anda ingin mengurangi 30 menit, Anda akan melewati dalam -25untuk setMinutes (), yang cukup pintar untuk mengetahui bahwa 3:-25adalah 2:35. (Yaitu tidak membuang pengecualian.)
Kip
2
@ Tip - Terima kasih, itulah wawasan yang menjadikan jawaban ini berharga. Tetapi apakah semua browser menjamin hal ini? Saya bertanya karena MDN mengatakan hanya 0 - 59 yang diizinkan - tapi saya curiga dokumennya salah dalam kasus ini? Lihat: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Justin Ethier
Ini lebih berguna bagi saya, saya ingin mengurangi waktu dari contoh objek Date yang ada yang dibuat dengan cara tertentu melalui konstruktor. Terima kasih!
Bill Effin Murray
1
Ingatlah bahwa .setMinutes(...)kekuatan menangani intnilai. Jika Anda menetapkan 1.5 minuteske dalam Dateitu hanya akan mengatur 1 minutedan menjaga detik sama seperti sebelumnya.
Gabriel L. Oliveira
Saya mendapatkan nilai yang salah dalam use case yang sama ketika saya mencoba startDate = endDate. Sepertinya masalah ketika salinan dangkal terjadi
raghav710
35

Semuanya hanya kutu, tidak perlu menghafal metode ...

var aMinuteAgo = new Date( Date.now() - 1000 * 60 );

atau

var aMinuteLess = new Date( someDate.getTime() - 1000 * 60 );

memperbarui

Setelah bekerja dengan momentjs, saya harus mengatakan ini adalah perpustakaan yang luar biasa yang harus Anda periksa. Memang benar bahwa kutu bekerja dalam banyak kasus membuat kode Anda sangat kecil dan Anda harus mencoba membuat kode Anda sekecil mungkin untuk apa yang perlu Anda lakukan. Tetapi untuk hal yang rumit, gunakan momentjs.

Jason Sebring
sumber
2
IMO ini tidak sesederhana itu. Dibutuhkan upaya untuk mendekripsi apa kode ini sebenarnya. Pendekatan yang lebih baik adalah dengan membungkus logika semacam itu dalam suatu fungsi.
sszarek
12

moment.js memiliki beberapa metode kenyamanan yang sangat bagus untuk memanipulasi objek tanggal

Itu .subtract metode, memungkinkan Anda untuk mengurangi sejumlah unit waktu dari tanggal, dengan menyediakan jumlah dan string TIMEUNIT.

var now = new Date();
// Sun Jan 22 2017 17:12:18 GMT+0200 ...
var olderDate = moment(now).subtract(3, 'minutes').toDate();
// Sun Jan 22 2017 17:09:18 GMT+0200 ...
svarog
sumber
6

Inilah yang saya temukan:

//First, start with a particular time
var date = new Date();

//Add two hours
var dd = date.setHours(date.getHours() + 2);

//Go back 3 days
var dd = date.setDate(date.getDate() - 3);

//One minute ago...
var dd = date.setMinutes(date.getMinutes() - 1);

//Display the date:
var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var date = new Date(dd);
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
var displayDate = monthNames[monthIndex] + ' ' + day + ', ' + year;
alert('Date is now: ' + displayDate);

Sumber:

http://www.javascriptcookbook.com/article/Perform-date-manipulations-based-on-adding-or-subtracting-time/

https://stackoverflow.com/a/12798270/1873386

crashwap
sumber
5
var date=new Date();

//here I am using "-30" to subtract 30 minutes from the current time.
var minute=date.setMinutes(date.getMinutes()-30); 

console.log(minute) //it will print the time and date according to the above condition in Unix-timestamp format.

Anda dapat mengubah cap waktu Unix menjadi waktu konvensional dengan menggunakan. sebagai new Date()contoh

var extract=new Date(minute)
console.log(minute)//this will print the time in the readable format.
Rajesh Vinay Kumar
sumber
Saya telah membuat beberapa perubahan format. Pastikan itu masih mencerminkan apa yang ingin Anda kirim.
adiga
1

Coba seperti di bawah ini:

var dt = new Date();
dt.setMinutes( dt.getMinutes() - 20 );
console.log('#####',dt);
Jitendra
sumber
0

Inilah yang saya lakukan: lihat di Codepen

var somedate = 1473888180593;
var myStartDate;
//var myStartDate = somedate - durationInMuntes;

myStartDate = new Date(dateAfterSubtracted('minutes', 100));

alert("The event will start on " + myStartDate.toDateString() + " at " + myStartDate.toTimeString());

function dateAfterSubtracted(range, amount){
    var now = new Date();
    if(range === 'years'){
        return now.setDate(now.getYear() - amount);
    }
    if(range === 'months'){
        return now.setDate(now.getMonth() - amount);
    }
    if(range === 'days'){
        return now.setDate(now.getDate() - amount);
    }
    if(range === 'hours'){
        return now.setDate(now.getHours() - amount);
    }
    if(range === 'minutes'){
        return now.setDate(now.getMinutes() - amount);
    }
    else {
        return null;
    }
}
Ronnie Royston
sumber
OP tidak menggunakan new Date(), tetapi memiliki beberapa tanggal yang ditentukan, dan hanya bertanya tentang pengurangan menit. Juga, kode Anda tidak berfungsi - ia mengembalikan timestamp UNIX bukan objek Tanggal.
Michał Perłakowski
0

Perpanjang kelas Tanggal dengan fungsi ini

// Add (or substract if value is negative) the value, expresed in timeUnit
// to the date and return the new date.
Date.dateAdd = function(currentDate, value, timeUnit) {

    timeUnit = timeUnit.toLowerCase();
    var multiplyBy = { w:604800000,
                     d:86400000,
                     h:3600000,
                     m:60000,
                     s:1000 };
    var updatedDate = new Date(currentDate.getTime() + multiplyBy[timeUnit] * value);

    return updatedDate;
};

Jadi, Anda dapat menambah atau mengurangi sejumlah menit, detik, jam, hari ... ke tanggal berapa pun.

add_10_minutes_to_current_date = Date.dateAdd( Date(), 10, "m");
subs_1_hour_to_a_date = Date.dateAdd( date_value, -1, "h");
Gonzalo Cao
sumber