2010-12-03 29 views

Répondre

51

L'une des façons les plus simples:

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

Cela ne prend pas en compte DST (Daylight Saving Time). Une alternative est Calendar:

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

Ceci est cependant une API assez laid. Une alternative est JodaTime:

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

Pourquoi l'heure d'été n'est-elle pas prise en compte? –

+2

La première façon fonctionne, même si je pense qu'il est préférable de dire qu'il ne prend pas en compte les transitions DST * timezone *. +1 pour mentionner JodaTime. –

+4

@Thor: Parce que pendant l'exécution, vous ne savez pas sur la base de 'System # currentTimeMillis()' si DST a été activé/désactivé au cours des 4 dernières heures, vous risquez de perdre l'heure. – BalusC

2

convertir en millisecondes, soustraire le nombre de millisecondes en 4 heures, reconvertir à une date.

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

'Calendar.HOUR' est basé sur 12 heures (AM/PM) et non sur 24 heures. Vous voulez 'Calendar.HOUR_OF_DAY'. En outre, l'utilisation de 'factory # getInstance()' est préférable à la construction manuelle d'un calendrier spécifique à une région. – BalusC

+0

@BalusC: Corrigé. –

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

Dans ce cas, ajouter est préférable au rouleau. – Avrom

+0

La méthode roll ne fonctionne que entre 4h00 et 23h59. Sinon, vous obtiendrez un mauvais jour. – Robert

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

Les autres réponses sont correctes, mais je voudrais contribuer la réponse moderne. La solution moderne utilise java.time, l'API de date et heure Java moderne.

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

Ce imprimé juste:

2018-01-31T15:22:21.113710Z 

Le Z à la fin indique que le temps est imprimé en UTC - à UTC zéro décalage si vous voulez. La classe Instant est le remplacement moderne pour Date, je vous recommande donc de vous y tenir. L'API moderne est généralement tellement plus agréable à utiliser, tellement plus propre, tellement mieux conçu.

Veuillez noter les avantages de laisser la classe de bibliothèque faire la soustraction de 4 heures pour vous: le code est plus clair à lire et moins sujette aux erreurs. Pas de constantes drôles, et aucun lecteur ne prend le temps de vérifier si elles sont correctes.

Si vous faites ont besoin d'une ancienne objet Date, par exemple lors de l'utilisation d'une API héritage que vous ne pouvez pas changer ou ne veulent pas changer, convertir comme ceci:

Date oldfashionedDate = Date.from(fourHoursAgo); 

Lien:Oracle Tutorial trail: Date Time. Bien sûr, il existe d'autres ressources sur Internet, s'il vous plaît chercher.

+0

La prochaine fois, il suffit de voter pour fermer comme dupe au lieu d'afficher des réponses en double. – BalusC

+0

Voyez votre point de vue, @BalusC. J'aurais si je les avais considérés comme des doublons exacts (il y a un chevauchement substantiel entre mes deux réponses, mais ils ne sont pas identiques). –