İki Tarih Arasında Kaç Saniye Var?


181

İki randevum var YYYY-MM-DDveZZZZ-NN-EE

Aralarında kaç saniye olduğunu nasıl öğrenebilirim?


173
Yakalanmamak için tarihler arasında en az yarım saat bırakmaya çalışıyorum.
Don Branson

yyyy-MM-ddaçıktır (yıl, ay, gün - hepsinin büyük harf olmadığını unutmayın), ancak ZZZZ-NN-EE öyle değil. Bunu (saat dilimi, ???, hafta içi) olarak yorumluyorum. Yıl içinde mi? Eğer öyleyse, bu olurdu ww. Ama yine de farkı hesaplamak için yıla ihtiyacımız var. Lütfen gerçek örnek değerlerin bir kısmını verebilir misiniz?
BalusC

7
@BalusC: Sanırım ikinci bir tarihi belirtmek için bir sonraki harflere gitti (Y -> Z, M -> N ve D -> E). StartDate ve endDate gibi değişken adları kullanmak muhtemelen daha iyi olurdu.
Austin Salonen

Ah, anlıyorum. Bu gerçekten daha açık bir şekilde sorulabilirdi.
BalusC

Yanıtlar:


242

YYYY & ZZZZ'yi yıl anlamına gelen tamsayı değerleri, MM & NN'yi yılın ayı anlamına gelen tamsayı değerleri ve DD & EE'yi ayın günü anlamına gelen tamsayı değerleri olarak alıyorum.

var t1 = new Date(YYYY, MM, DD, 0, 0, 0, 0);
var t2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0);
var dif = t1.getTime() - t2.getTime();

var Seconds_from_T1_to_T2 = dif / 1000;
var Seconds_Between_Dates = Math.abs(Seconds_from_T1_to_T2);

İleride başvurmak için kullanışlı bir kaynak MDN sitesidir

Alternatif olarak, tarihleriniz bir biçimde gelirse, javascript ayrıştırılabilir

var dif = Date.parse(MM + " " + DD + ", " + YYYY) - Date.parse(NN + " " + EE + ", " + ZZZZ);

ve sonra bu değeri milisaniye cinsinden fark olarak kullanabilirsiniz (her iki örneğimdeki dif aynı anlama gelir)


1
Sadece örnekte kullanılan kalıplar doğru değil. 4 haneli yıllar küçük harf yyyy, 2 haneli aylar büyük harf MMve 2 haneli günler küçük harf ile belirtilir dd.
BalusC

1
Martin, burada herhangi bir tarih örüntüsü kullanmayan bir izlenim var. AA GG, YYYY ve NN EE, ZZZZ aslında Steven'ın sorduğu "örnek değerler" tir. Başka bir deyişle, biçimlendirme için herhangi bir tür yapmıyor.
Wagner Silveira

İkinci örneği güncelledim, sanırım herkes karıştı. Ben de onun örneğinde verilen değerleri tam olarak nasıl yorumladığım konusunda biraz açıklama ekledim.
Martin

İkinci değişkeninizin çağrılması gerekir t2.
Kees C.Bakker

Çoğu durumda muhtemelen t2 yapacağız - t1 değil t1 - t2
UpTheCreek

83

Sadece çıkartın:

var a = new Date();
alert("Wait a few seconds, then click OK");

var b = new Date();
var difference = (b - a) / 1000;

alert("You waited: " + difference + " seconds");

@ user3344977 - o zaman komik bir şeyler oluyor! Değerlerini kontrol edin ave bTarih olduklarından emin olun.
Seth

@Eğer doğru olduğunu bu yüzden yorumumu sildim .. benim "tarihleri" biri aslında bir dize oldu. Bu mükemmel çalışıyor.
user3344977

14

Tarihlerinizden biri veya her ikisi de gelecekte ise, ikinci doğruluk istiyorsanız SOL olduğunuzdan korkarım. UTC zamanı, gerçekleşmeden yaklaşık 6 ay öncesine kadar bilinmeyen artık saniyelere sahiptir, bu nedenle bundan daha sonraki tarihler birkaç saniye yanlış olabilir (ve pratikte, insanlar makinelerini sık sık güncellemediğinden, gelecekte herhangi bir zamanın birkaç saniye kapalı olduğunu görebilirsiniz).

Bu, tarih / saat kütüphaneleri tasarlama teorisi ve bunun neden böyle olduğu hakkında iyi bir açıklama verir: http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/details.html#date_time.tradeoffs


7
Artık ikinci sayıdan bahsettiğiniz için +1! Daha iyi bilmesi gereken insanlar tarafından bile, bu yanlış kullanıldığında çok sinir bozucu (POSIX komitesi, sana bakıyorum ...)
Jim Lewis

1
(: Hatta yani Worth ECMA standardı açıkça artık saniye görmezden söz geçmiş sıçrama saniye): değerleri sıçrama saniye dikkate alınmaz Zamanla. Günde tam olarak 86.400.000 milisaniye olduğu varsayılmaktadır .
Sylvain Leroux

11

Basitçe yapabilirsiniz.

var secondBetweenTwoDate = Math.abs((new Date().getTime() - oldDate.getTime()) / 1000);


4
var a = new Date("2010 jan 10"),
    b = new Date("2010 jan 9");

alert(
    a + "\n" + 
    b + "\n" +
    "Difference: " + ((+a - +b) / 1000)
);

0

Kolay yol:

function diff_hours(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60 * 60);
  return Math.abs(Math.round(diff));

 }


function diff_minutes(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60);
  return Math.abs(Math.round(diff));

 }

function diff_seconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  return Math.abs(Math.round(diff));

 }

function diff_miliseconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime());
  return Math.abs(Math.round(diff));

 }


dt1 = new Date(2014,10,2);
dt2 = new Date(2014,10,3);
console.log(diff_hours(dt1, dt2));


dt1 = new Date("October 13, 2014 08:11:00");
dt2 = new Date("October 14, 2014 11:13:00");
console.log(diff_hours(dt1, dt2));

console.log(diff_minutes(dt1, dt2));

console.log(diff_seconds(dt1, dt2));

console.log(diff_miliseconds(dt1, dt2));

-3

Bash'da:

bc <<< "$(date --date='1 week ago' +%s) - \
    $(date --date='Sun,  29 Feb 2004 16:21:42 -0800' +%s)"

Bc ve gnu tarihinin kurulu olmasını gerektirir.


1
Bu nasıl alakalı?
Bırakma

-10

.Net, sizin için matematik yapmak için TimeSpan sınıfını sağlar.

var time1 = new Date(YYYY, MM, DD, 0, 0, 0, 0)
var time2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0)

Dim ts As TimeSpan = time2.Subtract(time1)

ts.TotalSeconds

@Jeff, puanları kaybetmemek için bu cevabı silmek isteyebilirsiniz. Visual Basic kaynak kodu yerine JavaScript kaynak kodu istediler.
MacGyver
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.