JavaScript'teki bir tarihten dakikaları nasıl çıkarabilirim?


134

Bu sözde kodu çalışan js'ye nasıl çevirebilirim [geçerli bir javascript tarihi dışında bitiş tarihinin nereden geldiği konusunda endişelenmeyin].

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

Yanıtlar:


200

Bunu öğrendikten sonra:

  • Bir oluşturabilir Datearayarak yapıcısı Jan 1, 1970 yılından bu yana milisaniye ile.
  • valueOf()Bir DateJan 1, 1970 yılından bu yana milisaniye sayısıdır
  • 60,000Bir dakika içinde milisaniye var : -]

... o kadar da zor değil.

Aşağıdaki kodda Date, uygun milisaniye sayısını şunlardan çıkararak yeni bir oluşturulur myEndDateTime:

var MS_PER_MINUTE = 60000;
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE);

6
Ancak dakika eklediğinizde işlem yapmaz. Dakika eklediğinizde doğru şekilde işlemek için kullanmalısınız .getTime(). Örnek:var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
Gabriel L. Oliveira

Ayrıca şunu da kullanabilirsiniz: var myStartDate = somedate.addMinutes(-durationInMuntes);Ben somedate'in bir Tarih nesnesi olduğunu varsayabilirsiniz
kubahaha

1
İşe yarıyor ... ama Date () yapıcısının 3 seçeneğe sahip olduğuna dair bir sorunuz var, yani 1: boş 2: string ve 3: Number year, Number Month .... yani yukarıda kullanılan hangi kurucuyu takip ediyor?
Zafar


Nasıl bir örnek için bu zaman dilimi yerel ayarı olarak Avrupa / Londra kullanarak, yanlış gidebilir: var d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);beklediğiniz eolmak 02:10:00, doğru mu? Hayır! 01:10:00. DST merhaba diyor. Ve sonra artık saniyeler var ...
Niet the Dark Absol

81

Bunu başarmak için alma ve ayarlama dakikalarını da kullanabilirsiniz:

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

startdate.setMinutes(endDate.getMinutes() - durationInMinutes);

52
setMinutes()Negatif dakikaları doğru bir şekilde işlemek için yeterince akıllı olduğunu belirtmek gerekir . Yani eğer başlangıç tarihi 03:05 idi ve sen de geçirerek, 30 dakika çıkarmak isteyen -25bilmek akıllı yeterlidir setMinutes () e 3:-25olan 2:35. (yani bir istisna oluşturmaz.)
Kip

2
@Kip - Teşekkürler, bu cevabı değerli kılan fikir budur. Ancak tüm tarayıcılar bunu garanti ediyor mu? Soruyorum çünkü MDN sadece 0 - 59'a izin verildiğini söylüyor - ancak bu durumda belgelerin yanlış olduğundan şüpheleniyorum? Bakınız: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Justin Ethier

Bu benim için daha yararlı oldu, kurucu aracılığıyla belirli bir şekilde ayarlanmış mevcut bir Date nesnesi örneğinden saati çıkarmak istedim. Teşekkür ederim!
Bill Effin Murray

1
Sadece .setMinutes(...)kuvvet işleme intdeğerlerini hatırlayın . Eğer ayarlarsanız 1.5 minutesbir içine Datesadece oluştururuz 1 minuteve et saniye önce olduğu gibi aynı tutmak.
Gabriel L. Oliveira

StartDate = endDate'i denediğimde benzer bir kullanım durumunda yanlış değerler alıyordum. Sığ bir kopyanın meydana geldiği soruna benziyor
raghav710

35

Her şey sadece kenedir, metotları ezberlemeye gerek yoktur ...

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

veya

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

Güncelleme

Momentjs ile çalıştıktan sonra, buranın göz atmanız gereken harika bir kütüphane olduğunu söylemeliyim. Çoğu durumda kenelerin işe yaradığı ve kodunuzu çok küçük hale getirdiği doğrudur ve yapmanız gerekenler için kodunuzu olabildiğince küçültmeye çalışmalısınız. Ancak karmaşık her şey için momentjs kullanın.


2
IMO bu o kadar basit değil. Bu kodun gerçekte ne yaptığını çözmek biraz çaba gerektirir. Daha iyi yaklaşım, bu tür bir mantığı bir işleve sarmaktır.
sszarek

12

moment.js , tarih nesnelerini işlemek için gerçekten güzel bazı kolaylık yöntemlerine sahiptir

.Subtract yöntem, sen miktarını ve TIMEUNIT dize sağlayarak, bir tarihten itibaren zaman birimlerinin belirli bir miktar çıkarma sağlar.

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 ...

6

Bulduğum şey bu:

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

Kaynaklar:

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

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


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.

Unix zaman damgasını, new Date()örneğin . kullanarak geleneksel zamana dönüştürebilirsiniz.

var extract=new Date(minute)
console.log(minute)//this will print the time in the readable format.

Bazı biçimlendirme değişiklikleri yaptım. Lütfen göndermeyi planladığınız şeyi hala yansıttığından emin olun.
adiga

1

Aşağıdaki gibi deneyin:

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

0

Yaptığım şey buydu: Codepen'de görün

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

OP kullanmaz new Date(), ancak belirli bir tarihe sahiptir ve yalnızca dakikaların çıkarılmasını istedi. Ayrıca kodunuz çalışmaz - Date nesnesi yerine UNIX zaman damgasını döndürür.
Michał Perłakowski

0

Bu işlevle Date sınıfını genişletin

// 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;
};

Böylece herhangi bir tarihe birkaç dakika, saniye, saat, gün ... ekleyebilir veya çıkarabilirsiniz.

add_10_minutes_to_current_date = Date.dateAdd( Date(), 10, "m");
subs_1_hour_to_a_date = Date.dateAdd( date_value, -1, "h");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.