2010-08-12 3 views
5

J'utilise un outils de reporting qui ne supportent que l'expression d'une ligneUne seule expression pour obtenir la date d'hier et le premier jour du mois

Par exemple, je veux la date d'hier

la classe Calendrier a une méthode add, mais il retourne void si

Calendar.getInstance().add(Calendar.DAY_OF_MONTH,-1).getTime() 

ne fonctionne pas

ne savent pas comment obtenir ce fait

Merci

+2

La date d'hier dans quel format? En tant qu'objet de calendrier? Comme une chaîne? En tant que util.Date? En tant que sql.Date? – Stephen

Répondre

2

Si elle doit vraiment être un si le code est compréhensible et il n'a pas d'importance en une ligne, je pense que la déclaration suivante devrait fonctionner:

Date yesterday = new SimpleDateFormat("yyyyMMdd").parse(
    ""+(Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()))-1)); 

il formate la date du jour comme "aaaaMMdj", par ex. "20100812" pour aujourd'hui, l'analyse comme un int: 20100812, soustrait un: 20100811, puis analyse la date "20100811" en utilisant le format précédent. Il fonctionnera également si aujourd'hui est le premier d'un mois, puisque le 0 d'un mois est analysé par un DateFormat indulgent comme le dernier jour du mois précédent.

Le format "aaaaDDD" devrait également fonctionner (D étant le jour de l'année).

Pour le premier jour du mois en cours, vous pouvez utiliser une astuce similaire:

Date firstday = new SimpleDateFormat("yyyyMMdd").parse(
    new SimpleDateFormat("yyyyMM").format(new Date())+"01"); 
+0

@jarnbjo merci ~~ fonctionne bien – chun

+0

@jarnbjo Je suis désolé, j'ai revérifié la question et votre réponse et j'ai découvert que j'avais totalement mal compris le problème. Votre réponse est 100% correcte. Pas de sentiments forts. Mes commentaires n'avaient aucun sens alors je les ai supprimés. – vizog

4

Utilisez Joda-Time:

new org.joda.time.DateTime().minusDays(1).toDate(); 
+1

Bien sûr, joda encore une fois, mais s'il est limité à one-liners, alors je doute réellement qu'il puisse inclure des librairies tierces. –

2

Ne peut pas vous faire quelque chose comme

new Date(new Date().getTime() - 86400000); 

pour obtenir l'heure actuelle, il faut soustraire le nombre de millisecondes en un jour, et la construction d'une Nouvel objet date de cela?

+3

Devrait fonctionner avec 'System.currentTimeMillis()' au lieu de 'new Date(). GetTime()' aussi. –

+0

Bon point. Mieux vaut réduire le nombre d'objets. –

+2

La logique est fausse, puisque tous les jours ont 86400000ms. – jarnbjo

1

En supposant que vous voulez un objet java.util.Date (depuis que vous avez utilisé getTime() dans votre question et qui retourne une java.util.Date), vous pouvez faire:

// Get yesterday's date. System.currentTimeMillis() returns the 
// number of milliseconds between the epoch and today, and the 
// 86400000 is the number of milliseconds in a day. 
new Date(System.currentTimeMillis() - 86400000); 

Oops, n'a pas vu votre premier jour de la requête mois avant . Je suis venu avec ce qui suit pour obtenir cela en utilisant util.Date, mais je pense que c'est le temps que vous voulez passer en utilisant Joda ou Calendar ... (SO, s'il vous plaît ne me rejette pas pour l'horreur de ce qui suit. ..)

// This will return the day of the week as an integer, 0 to 6. 
new Date(System.currentTimeMillis() - ((new Date().getDate()-1) * 86400000)).getDay(); 
0

Cela devrait se faire comme suit:

Calendar cal = Calendar.getInstance(); 
cal .add(Calendar.DAY_OF_MONTH,-1); 
cal .getTime(); 

Lorsque vous faites ceci:

Calendar.getInstance().add(Calendar.DAY_OF_MONTH,-1).getTime() 

Vous demandez essentiellement une méthode (add()) qui renvoie void pour exécuter .getTime(). Cela ne peut pas fonctionner.

0

C'est ce que je l'utilise dans JasperReports:

// Today 
new java.util.Date().format('yyyy-MM-dd') 
// Yesterday 
new SimpleDateFormat("yyyy-MM-dd").format(new Date()-1) 

// First Day of current month 
new java.util.Date().format('yyyy') + "-" + new java.util.Date().format('MM') + "-01" 

Je préfère utiliser le format ISO YYYY-MM-DD car est reconnu partout et éviter la confusion régionale des formats (dd/mm de position sur le champ de date).

Questions connexes