2011-06-22 13 views
9
Date nowdate = new Date(); 
long nowms = nowdate.getTime(); 
long differencems = numdaysback * 24 * 60 * 60 * 1000; 
long thenms = nowms - differencems; 
Date thendate = new Date(thenms); 

Numdaysback 365 ise, o zaman bir tarihin daha geç olacağını düşünürdüm. ama bu ... yaklaşık üç hafta önce değil mi?Java Tarih ile ilgili tarihler, tarihte arama X gün önce

NUMDAYSBACK: 365 
NOWDATE: Wed Jun 22 20:31:58 SGT 2011 
NOWMS: 1308745918625 
DIFFERENCEMS: 1471228928 
THENMS: 1307274689697 
THENDATE: Sun Jun 05 19:51:29 SGT 2011 

cevap

25

nereden:

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.YEAR, -1); 
Date thendate = cal.getTime(); 

daha kısa ve nettir, yıllar sıçrama DST bakılmaksızın günün aynı saati döndürür ya ... Genellikle

Calendar böyle gitmek yoludur durumlarda (Joda Time gibi bir 3. parti kütüphanesi kullanmıyorsanız). Her türlü hesaplama için kullanabilirsiniz: N gün/saat/ay/saniye ekleyin, tam bir saatin kısaltılması vb. - sadece long ile çok fazla acı çeken şeyler. Orijinal soru ile ilgili olarak, tamsayı taşması kurbanı gibi görünmektedir. Bu hat

long differencems = 365 * 24 * 60 * 60 * 1000L; 
+0

İyi bir çözüm. Şimdi her şey istediği gibi çalışıyor :) – Jesper

+3

+1, sorunun ne olduğunu söylemek yerine ona neyin yanlış olduğunu söylemek için. –

0

:

long differencems = numdaysback * 24 * 60 * 60 * 1000; 

RHS olmalıdır: çarpma açıkça uzun kullanıyorsa O inşaat 31536000000. Sen çok daha az şey var, ÜSÖ olmanın sebebi bir int değerlendirilmektedir (tüm miktarlar ints) ve MAX_INT değerini aşıyorsunuz. Buna düzeltmek için:

long differencems = numdaysback * 24 * 60 * 60 * 1000l; 

Not 1000 uzun yapar "l" - şimdi RHS bir sürece değerlendirilecektir.

+0

Burada herkese teşekkürler. Takvimle hepiniz önereceğiniz gibi gidiyorum. – Jesper

3

Sadece bu deneyin:

long differencems = numdaysback * 24L * 60 * 60 * 1000; 

Eğer çarpma tamsayı nedeniyle basamak gevşek olmayacak yeni kod ile. Hazırlık 24'ü uzun olarak işaretlediğimizden, çarpım otomatik olarak ilk işlenen numdaysback'i uzun süre dönüştürerek yapılacaktır. Çarpmanın geri kalanı da uzun işlenenler üzerinde yapılacaktır.

0

Date sınıfı (resmi olmayan) kullanımdan kaldırılmıştır. API çok fazla hataya sahip, Tarih/Times doğru bir şekilde almak gerçekten çok zor. En kolay örnek, differencems kodunuz gibi bir şeydir. Eğer inbetween bir gün ışığından yararlanma anahtarı içeriyorsa (UT kullanmıyorsanız) ve her zaman sıçrama saniye ile ilgilenmezse başarısız olur.

Uygulamanız doğru tarihlere bağlıysa, Joda Time kullanmak isteyebilirsiniz.

İlgili konular