JavaScript'teki iki Tarih arasındaki farkı nasıl anlayabilirim?


111

Bir zaman çerçevesi ile olayları tanımlamanıza izin veren bir uygulama oluşturuyorum. Kullanıcı başlangıç ​​tarihini seçtiğinde veya değiştirdiğinde bitiş tarihini otomatik olarak doldurmak istiyorum. Bununla birlikte, iki zaman arasındaki farkı nasıl elde edeceğimi ve sonra bu farkı kullanarak nasıl yeni bir bitiş Tarihi oluşturacağımı tam olarak anlayamıyorum.

Yanıtlar:


73

JavaScript'te tarihler, getTime()yöntemi çağırarak veya yalnızca sayısal bir ifadede tarihi kullanarak epoc'tan beri geçen milisaniye sayısına dönüştürülebilir .

Yani farkı elde etmek için iki tarihi çıkarmanız yeterli.

Farka göre yeni bir tarih oluşturmak için yapıcıda milisaniye sayısını geçirmeniz yeterlidir.

var oldBegin = ...
var oldEnd = ...
var newBegin = ...

var newEnd = new Date(newBegin + oldEnd - oldBegin);

Bu sadece çalışmalı

DÜZENLEME : @bdukes tarafından belirtilen hata düzeltildi

DÜZENLE :

Davranışın açıklaması için, oldBegin, oldEnd, ve newBeginvardır Dateörnekleri. Operatörleri çağrılması +ve -JavaScript oto casting tetikleyecek ve otomatik arayacak valueOf()bu nesnelerin prototip yöntemi. valueOf()Yöntemin Datenesneye bir çağrı olarak uygulandığı görülür getTime().

Yani temelde: date.getTime() === date.valueOf() === (0 + date) === (+date)


.GetTime () işlevinin çalışması için gereken format nedir ... Örneğin - yeni Date ('22 -12-2012 00:00 '). GetTime () çalışmayacak ... Herhangi bir fikir?
Jimmyt1988

1
JS'de tarih ayrıştırma için şu soruya bir göz atmanızı öneririm: stackoverflow.com/questions/1576753/…
Vincent Robert

8
OldBegin, oldEnd ve NewBegin Datenesneler mi olmalı ? Değişken bildirimi burada ihmal edildiğinden, bunların ne tür bir nesne olması gerektiğini söylemek zor.
Anderson Green

Ayrıca, JavaScript'te tarih eklemek veya çıkarmak için kullanabileceğiniz bir işlev var: stackoverflow.com/a/1214753/975097
Anderson Green

Sayılar ve günler eklemeye dikkat edin. Açıklama için aşağıdaki cevabıma bakın
Dan

24

JavaScript, kullanıma hazır tarih farkını mükemmel şekilde destekler

var msMinute = 60*1000, 
    msDay = 60*60*24*1000,
    a = new Date(2012, 2, 12, 23, 59, 59),
    b = new Date("2013 march 12");


console.log(Math.floor((b - a) / msDay) + ' full days between');
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between');

Şimdi bazı tuzaklar. Bunu dene:

console.log(a - 10);
console.log(a + 10);

Dolayısıyla, bir sayı ve Tarih ekleme riskiniz varsa, Tarihi numberdoğrudan dönüştürün .

console.log(a.getTime() - 10);
console.log(a.getTime() + 10);

İlk örneğim Date nesnesinin gücünü gösteriyor ama aslında bir saatli bomba gibi görünüyor


Dan, örneğini anlaması ve izlemesi en kolay olanı buldum. Teşekkürler.
Melanie

5
"Tuzaklar" aslında dil spesifikasyonuna dayalı varsayılanlardır. Çıkarma operatörü -, bağımsız değişkenleri sayıya zorlar, böylece Tarih zaman değerini döndürür. +Operatör aşırı yüklenmiştir, böylece sayı veya birbirine bağlanmasına yol, zorlama ek yapabilir. Bu durumda Tarihler String'e zorladığından +, birleştirme yapar. Karışıklık, Date nesnesinin değil, operatörlerin aşırı yüklenmesinden kaynaklanır.
RobG

9

JsFiddle DEMO'yu görün

    var date1 = new Date();    
    var date2 = new Date("2025/07/30 21:59:00");
    //Customise date2 for your required future time

    showDiff();

function showDiff(date1, date2){

    var diff = (date2 - date1)/1000;
    diff = Math.abs(Math.floor(diff));

    var days = Math.floor(diff/(24*60*60));
    var leftSec = diff - days * 24*60*60;

    var hrs = Math.floor(leftSec/(60*60));
    var leftSec = leftSec - hrs * 60*60;

    var min = Math.floor(leftSec/(60));
    var leftSec = leftSec - min * 60;

    document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";

setTimeout(showDiff,1000);
}

HTML Kodunuz için:

<div id="showTime"></div>

4

Zaman bileşenini önemsemiyorsanız, .getDate()ve .setDate()sadece tarih bölümünü ayarlamak için kullanabilirsiniz .

Bu nedenle, bitiş tarihinizi başlangıç ​​tarihinizden 2 hafta sonrasına ayarlamak için şuna benzer bir şey yapın:

function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

İki tarih arasındaki farkı (gün olarak) döndürmek için şunu yapın:

function GetDateDiff(startDate, endDate)
{
    return endDate.getDate() - startDate.getDate();
}

Son olarak, ilk işlevi değiştirelim, böylece 2. tarafından döndürülen değeri parametre olarak alabilir:

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}

31
GetDateDiff()aylık engelleri aşacak. Örneğin, 2011/04/26 ve 2011/05/01, -25 değerini döndürür, ancak ofset 5 gün olmalıdır.
nfm

var ds = yeni Tarih (2014, 0, 31, 0, 0, 0, 0); var de = new Date (2014, 2, 31, 0, 0, 0, 0); GetDateDiff (ds, de) dönüş 0
Noor

3

Teşekkürler @ Vincent Robert , aslında temel örneğinizi kullandım newBegin + oldEnd - oldBegin. İşte basitleştirilmiş son çözüm:

    // don't update end date if there's already an end date but not an old start date
    if (!oldEnd || oldBegin) {
        var selectedDateSpan = 1800000; // 30 minutes
        if (oldEnd) {
            selectedDateSpan = oldEnd - oldBegin;
        }

       newEnd = new Date(newBegin.getTime() + selectedDateSpan));
    }

1
Bu bazen kullandığınız niçin iyi bir nokta olduğunu getTimeve bazen
Dan

2

İhtiyaçlarınıza bağlı olarak, bu işlev 2 gün arasındaki farkı hesaplayacak ve ondalık gün cinsinden bir sonuç döndürecektir.

// This one returns a signed decimal. The sign indicates past or future.

this.getDateDiff = function(date1, date2) {
    return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
}

// This one always returns a positive decimal. (Suggested by Koen below)

this.getDateDiff = function(date1, date2) {
    return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
}

1
Bir Math.abs()çağrıya yerleştirin ve her zaman pozitif bir ondalık alırsınız.
Koen.

1
Güzel öneri Koen. Bu, insanlara 2 seçenek sunar: önerdiğiniz gibi yalnızca gerçek tarih farkı veya farkın geçmişte mi yoksa gelecekte mi olduğunu gösteren işaretli bir tarih belirleme. :)
sparkyspider

Lütfen JavaScript'te date.getTime()gelecekte / geçmişte zaman elde etmek için milisaniye cinsinden bir sayı ekleyebileceğinizi / çıkarabileceğinizi unutmayın . `var nextMinute = new Date (someDate.getTime () + 60 * 1000);
Dan

Bu bir yazım hatası mı? "2 gün arasında". Muhtemelen 2 tarih arasında.
tomazahlin

2

Moment.js kullanıyorsanız, tek bir kod satırında size gün cinsinden farkı verecek daha basit bir çözüm vardır.

moment(endDate).diff(moment(beginDate), 'days');

Ek ayrıntılar şurada bulunabilir: moment.js sayfasında

Şerefe, Miguel


1
function compare()
{
  var end_actual_time    = $('#date3').val();

  start_actual_time = new Date();
  end_actual_time = new Date(end_actual_time);

  var diff = end_actual_time-start_actual_time;

  var diffSeconds = diff/1000;
  var HH = Math.floor(diffSeconds/3600);
  var MM = Math.floor(diffSeconds%3600)/60;

  var formatted = ((HH < 10)?("0" + HH):HH) + ":" + ((MM < 10)?("0" + MM):MM)
  getTime(diffSeconds);
}
function getTime(seconds) {
  var days = Math.floor(leftover / 86400);

  //how many seconds are left
  leftover = leftover - (days * 86400);

  //how many full hours fits in the amount of leftover seconds
  var hours = Math.floor(leftover / 3600);

  //how many seconds are left
  leftover = leftover - (hours * 3600);

  //how many minutes fits in the amount of leftover seconds
  var minutes = leftover / 60;

  //how many seconds are left
  //leftover = leftover - (minutes * 60);
  alert(days + ':' + hours + ':' + minutes);
}

0
function checkdate() {
    var indate = new Date()
    indate.setDate(dat)
    indate.setMonth(mon - 1)
    indate.setFullYear(year)

    var one_day = 1000 * 60 * 60 * 24
    var diff = Math.ceil((indate.getTime() - now.getTime()) / (one_day))
    var str = diff + " days are remaining.."
    document.getElementById('print').innerHTML = str.fontcolor('blue')
}

0

alternatif modifikasyon genişletilmiş kod ..

http://jsfiddle.net/vvGPQ/48/

showDiff();

function showDiff(){
var date1 = new Date("2013/01/18 06:59:00");   
var date2 = new Date();
//Customise date2 for your required future time

var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));

var years = Math.floor(diff/(365*24*60*60));
var leftSec = diff - years * 365*24*60*60;

var month = Math.floor(leftSec/((365/12)*24*60*60));
var leftSec = leftSec - month * (365/12)*24*60*60;    

var days = Math.floor(leftSec/(24*60*60));
var leftSec = leftSec - days * 24*60*60;

var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;

var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;




document.getElementById("showTime").innerHTML = "You have " + years + " years "+ month + " month " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds the life time has passed.";

setTimeout(showDiff,1000);
}

Lütfen cevabınıza daha fazla açıklama ekleyin ve daha iyi İngilizce kullanın.
Fund Monica'nın Davası

Bu çözüm yanlıştır çünkü artık yılları ihmal ederek 365 gün kullanırsınız.
Sergey Goliney

0
<html>
<head>
<script>
function dayDiff()
{
     var start = document.getElementById("datepicker").value;
     var end= document.getElementById("date_picker").value;
     var oneDay = 24*60*60*1000; 
     var firstDate = new Date(start);
     var secondDate = new Date(end);    
     var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    document.getElementById("leave").value =diffDays ;
 }
</script>
</head>
<body>
<input type="text" name="datepicker"value=""/>
<input type="text" name="date_picker" onclick="function dayDiff()" value=""/>
<input type="text" name="leave" value=""/>
</body>
</html>

0

Bu kod, çalışmanın başlangıç ​​tarihini ve bitiş tarihini (kabul tarihini kalifiye edin) girdiğinizde çalışma yıllarının süresini doldurur ve sürenin bir yıldan az olup olmadığını kontrol edin, eğer evet ise, bir mesaj akılda tutulursa, ilk txtFromQualifDateve üç girdi öğesi vardır. ikincitxtQualifDate ve üçüncütxtStudyYears

kesirli yıl sayısının sonucunu gösterecektir

function getStudyYears()
    {
        if(document.getElementById('txtFromQualifDate').value != '' && document.getElementById('txtQualifDate').value != '')
        {
            var d1 = document.getElementById('txtFromQualifDate').value;

            var d2 = document.getElementById('txtQualifDate').value;

            var one_day=1000*60*60*24;

            var x = d1.split("/");
            var y = d2.split("/");

            var date1=new Date(x[2],(x[1]-1),x[0]);

            var date2=new Date(y[2],(y[1]-1),y[0])

            var dDays = (date2.getTime()-date1.getTime())/one_day;

            if(dDays < 365)
            {
                alert("the date between start study and graduate must not be less than a year !");

                document.getElementById('txtQualifDate').value = "";
                document.getElementById('txtStudyYears').value = "";

                return ;
            }

            var dMonths = Math.ceil(dDays / 30);

            var dYears = Math.floor(dMonths /12) + "." + dMonths % 12;

            document.getElementById('txtStudyYears').value = dYears;
        }
    }

1
Yıl bulmak için asla tarih dizelerini ayrıştırmayın, çünkü dizi görünümü (özellikle ayırıcılar) tarayıcılar arasında farklılık gösterir. getFullYearBunun için tasarlanmış olanı kullanın . ------- Muhtemelen çoğu köşe vakasını destekleyen googlecode'daki datejs kitaplığına bakın
Dan

tavsiye için teşekkürler @Dan ama benim için gerçek hükümet projesinde çalıştı ve test edildi (farklı tarayıcılar) o kadar zayıf programlama pratik mi? :)
shareef

0

Date nesnelerini kullanırsanız ve ardından getTime()her iki tarih için işlevi kullanırsanız, size 1 Ocak 1970'den bu yana sayı değerinde ilgili zamanları verecektir. Daha sonra bu sayılar arasındaki farkı anlayabilirsiniz.

Bu size yardımcı olmazsa, tüm belgelere bakın: http://www.w3schools.com/jsref/jsref_obj_date.asp


Oh, evet, farketmedim, bunun altındaki cevaplar en fazla yarım yaşında.
Koen.

0

Aşağıdaki kod, bugünden vadeli işlem tarihine kalan günleri döndürecektir.

Bağımlılıklar: jQuery ve MomentJs.

var getDaysLeft = function (date) {
  var today = new Date();
  var daysLeftInMilliSec = Math.abs(new Date(moment(today).format('YYYY-MM-DD')) - new Date(date));
  var daysLeft = daysLeftInMilliSec / (1000 * 60 * 60 * 24);   
  return daysLeft;
};

getDaysLeft('YYYY-MM-DD');

0
var getDaysLeft = function (date1, date2) {
   var daysDiffInMilliSec = Math.abs(new Date(date1) - new Date(date2));
   var daysLeft = daysDiffInMilliSec / (1000 * 60 * 60 * 24);   
   return daysLeft;
};
var date1='2018-05-18';
var date2='2018-05-25';
var dateDiff = getDaysLeft(date1, date2);
console.log(dateDiff);

0

SİSTEMİMDE YAPTIĞIM ŞEY BU.

var startTime=("08:00:00").split(":");
var endTime=("16:00:00").split(":");
var HoursInMinutes=((parseInt(endTime[0])*60)+parseInt(endTime[1]))-((parseInt(startTime[0])*60)+parseInt(startTime[1]));
console.log(HoursInMinutes/60);
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.