2010-12-03 23 views

cevap

51

Bir:

Date date = new Date(System.currentTimeMillis() - (4 * 60 * 60 * 1000)); 

Ancak bu hesaba DST (Daylight Saving Time) almaz. Alternatif Calendar geçerli:

Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.HOUR_OF_DAY, -4); 
Date date = calendar.getTime(); 

Ancak bu çok çirkin bir API olduğunu. Alternatif JodaTime geçerli:

DateTime dateTime = new DateTime().minusHours(4); 
Date date = dateTime.toDate(); // If you ever need this... 
+1

DST neden hesaba katmıyor? –

+2

İlk yöntem işe yaramazsa da, DST * zaman dilimi geçişlerini * hesaba katmadığını söylemek daha iyidir. JodaTime'den bahsetmek için +1. –

+4

@Thor: Çalışma zamanı sırasında, DST'nin son 4 saat içinde etkinleştirilip etkinleştirilmediğini System # currentTimeMillis() 'e dayalı olarak bilmediğinizden, sonuçta ortaya çıkma zamanını riske atabilirsiniz. – BalusC

2

, 4 saatte milisaniye sayısını çıkarmak milisaniye onu dönüştürme bir tarihi geri dönüştürün.

6
Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.HOUR_OF_DAY, -4); 
calendar.getTime(); 
+2

'Calendar.HOUR ', 24 saat tabanlı değil, 12 saat (AM/PM) tabanlı. 'Calendar.HOUR_OF_DAY' istiyorsun. Ayrıca, takvime özgü bir takvimi manuel olarak oluşturmak için 'Takvim # getInstance()' fabrikasının kullanılması tercih edilir. – BalusC

+0

@ ButalC: Düzeltildi. –

1
Calendar c =Calendar.getInstance() ; 
c.add(Calendar.HOUR,-4); 
Date d = c.getTime(); 
+0

Bu durumda, eklemek için ekleme tercih edilir. – Avrom

+0

Rulo yöntemi yalnızca 4:00 (am) ve 23:59 arasında çalışır. Aksi halde yanlış bir gün geçirirsin. – Robert

2
Calendar c = Calendar.getInstance(); 
c.add(Calendar.HOUR_OF_DAY, -4); 
java.util.Date d = c.getTime(); 
System.out.println(d); 
3

diğer cevaplar doğru bakın ama çağdaş cevabı katkıda bulunmak istiyoruz. Modern çözüm, modern Java tarih ve zaman API'sı olan java.time'u kullanır.

Instant fourHoursAgo = Instant.now().minus(Duration.ofHours(4)); 
System.out.println(fourHoursAgo); 

Bu sadece basılmış:

2018-01-31T15:22:21.113710Z 

sonunda Z zaman UTC basılmış olduğunu gösterir - eğer olacak UTC sıfır ofset de. Instant sınıfı, Date için modern bir yedektir, bu yüzden ona takmanızı tavsiye ederim. Modern API genellikle çalışmak için çok daha güzel, çok daha temiz, çok daha iyi tasarlanmış.

Kütüphane sınıfının sizin için 4 saatlik bir çıkarma işlemini yapmasının avantajlarını lütfen unutmayın: kodun okunması daha açık ve daha az hataya açık. Komik sabitler yok ve okuyucuların doğru olup olmadığını kontrol etmek için zaman ayırmıyorlar.

böyle dönüştürmek, değiştiremez veya değiştirmek istemediğiniz bir miras API kullanırken örneğin, eski usul Date nesne gerekiyor edin:

Date oldfashionedDate = Date.from(fourHoursAgo); 

Bağlantı:Oracle Tutorial trail: Date Time. Tabii internette başka kaynaklar da var, lütfen ara.

+0

Bir dahaki sefere iki kez cevap vermek yerine dupe'ye yakın bir oy verin. – BalusC

+0

Sizin noktanız, @BalusC. Onları tam kopyalar olarak düşünmüş olsaydım (iki cevap arasında büyük bir çakışma var, ama aynı değiller). –

İlgili konular