java.util.Date: il y a sept jours
J'ai créé un rapport dans Jasper Reports qui reconnaît UNIQUEMENT les fichiers Java.util.Date (et non les calendriers et les logiciels grégoriens, etc.).
Est-il possible de créer une date 7 jours avant la date actuelle?
Idéalement, cela ressemblerait à quelque chose comme ceci:
new Date(New Date() - 7)
UPDATE: Je ne saurais trop insister sur ce point: JasperReports NE RECONNAÎT PAS les objets du calendrier Java.
A partir de maintenant:
long DAY_IN_MS = 1000 * 60 * 60 * 24;
new Date(System.currentTimeMillis() - (7 * DAY_IN_MS))
De Date date
arbitraire:
new Date(date.getTime() - (7 * DAY_IN_MS))
Modifier: comme indiqué dans les autres réponses, ne tient pas compte de l'heure d'été, si cela est un facteur.
Juste pour clarifier cette limitation dont je parlais:
Pour les personnes affectées par l'heure d'été, si vous appelez 7 days earlier
, vous voulez dire que si maintenant est 12pm noon on 14 Mar 2010
, vous voulez que le calcul de 7 days earlier
aboutisse à 12pm on 7 Mar 2010
, alors faites attention.
Cette solution trouve la date et l'heure exactement 24 heures * 7 jours = 168 heures plus tôt.
Cependant, certaines personnes sont surprise lorsque cette solution détecte que, par exemple, (14 Mar 2010 1:00pm) - 7 * DAY_IN_MS
may renvoie un résultat in(7 Mar 2010 12:00pm)
où le temps {horloge murale) de votre Le fuseau horaire n'est pas identique entre les 2 date/heure (1pm
vs 12pm
). Cela est dû au fait que l'heure d'été commence ou se termine cette nuit-là et que le "temps qui passe" perd ou gagne une heure.
Si l'heure d'été n'est pas un facteur pour vous ou si vous voulez vraiment (168 hours)
exactement (quel que soit le décalage dans l'horloge murale), cette solution fonctionne correctement.
Sinon, vous devrez peut-être compenser lorsque votre 7 days earlier
ne signifie pas vraiment 168 heures exactement (en raison du démarrage ou de la fermeture de l'heure d'été à cette heure).
Utilisez la fonction de calendrier pour créer de nouveaux objets Date à l'aide de getTime()
:
import Java.util.GregorianCalendar;
import Java.util.Date;
Calendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_MONTH, -7);
Date sevenDaysAgo = cal.getTime();
essayer
Date sevenDay = new Date(System.currentTimeMillis() - 7L * 24 * 3600 * 1000));
Une autre méthode consiste à utiliser Calendar, mais je n'aime pas l'utiliser moi-même.
Puisque personne n'a encore mentionné TimeUnit
:
new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7))
Essaye ça:
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -7);
return c.getTime();
Je ne sais pas quand ils ont ajouté cela, mais JasperReports a son propre ensemble de "fonctions" pouvant manipuler les dates. Voici un exemple que je n'ai pas testé à fond:
DATE(YEAR(TODAY()), MONTH(TODAY()), DAY(TODAY()) - 7)
Cela crée un Java.util.Date
avec la date définie à 7 jours à compter de ce jour. Si vous souhaitez utiliser une date "d'ancrage" différente, remplacez simplement TODAY()
par la date que vous souhaitez utiliser.
Un "jour" déterminant nécessite un fuseau horaire. Un fuseau horaire définit le début d'un "jour". Un fuseau horaire inclut des règles de gestion de l'heure d'été et d'autres anomalies. Il n'y a pas de magie pour rendre les fuseaux horaires sans importance. Si vous ignorez le problème, le fuseau horaire par défaut de la machine virtuelle Java sera appliqué. Cela tend à la confusion et à la douleur.
Évitez Java.util.Date
Les classes Java.util.Date et .Calendar sont notoirement gênantes. Évite-les. Ils sont si graves que Sun/Oracle a accepté de les supplanter avec le nouveau package Java.time in Java 8. Utilisez soit ceci soit/ Joda-Time .
Joda-Time
Exemple de code dans Joda-Time 2.3.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); // Specify or else the JVM's default will apply.
DateTime dateTime = new DateTime( new Java.util.Date(), timeZone ); // Simulate passing a Date.
DateTime weekAgo = dateTime.minusDays( 7 );
Premier moment du jour
Vous pouvez également choisir d’ajuster l’heure du jour au premier moment de la journée afin de capturer le temps dont vous avez besoin. Appelez la méthode withTimeAtStartOfDay
. Gardez à l'esprit qu'il s'agit généralement de 00:00:00
mais pas toujours.
Évitez les méthodes et les classes de "minuit" dans Joda-Time. Ils sont basés sur un concept défectueux et sont maintenant obsolètes.
DateTime dateTimeStart = new DateTime( new Java.util.Date(), timeZone ).withTimeAtStartOfDay(); // Not necessarily the time "00:00:00".
DateTime weekAgo = dateTime.minusDays( 7 ).withTimeAtStartOfDay();
Convertir vers/de j.u.Date
Comme indiqué ci-dessus, pour convertir Java.util.Date en Joda-Time, passez simplement l'objet Date au constructeur de DateTime. Comprenez qu’un j.u.Date n’a pas de fuseau horaire, mais un DateTime. Donc, assignez le fuseau horaire souhaité/approprié pour décider quels sont les "jours" et quand ils commencent.
Pour aller dans l'autre sens, DateTime à j.u.Date, appelez simplement la méthode toDate
.
Java.util.Date date = dateTime.toDate();
Y a-t-il une raison pour laquelle vous ne pouvez pas faire de calcul dans votre haricot de sauvegarde? Envoyez-le ensuite à votre rapport en tant que paramètre.
En raison de la discussion animée:
La question peut ne pas avoir une réponse appropriée sans un fuseau horaire désigné.
en dessous, vous trouverez un code pour travailler avec le fuseau horaire par défaut (et par conséquent déconseillé) qui prend en compte le fuseau horaire par défaut pour l’heure avancée.
Date date= new Date();
date.setDate(date.getDate()-7);//date works as calendar w/ negatives
Bien que la solution fonctionne, elle est tout aussi fictive que de prendre en compte le fuseau horaire.
new Date(System.currentTimeMillis() - 10080*60000);//a week has 10080 minutes
S'il vous plaît, ne votez pas pour la réponse.
Je le fais de cette façon:
Date oneWeekAgo = DateUtils.addDays(DateUtils.truncate(new Date(), Java.util.Calendar.DAY_OF_MONTH), -7);
Tu peux essayer ça,
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -7);
System.out.println(new Java.sql.Date(c.getTimeInMillis()));