39 votes

Réinitialisation de la partie heure d'un horodatage en Java

En Java, à partir d'un horodatage, comment réinitialiser la partie heure seule à 00:00:00 afin que l'horodatage représente le minuit de ce jour particulier?

En T-SQL, cette requête fera de même, mais je ne sais pas comment faire cela en Java.

SELECT CAST( FLOOR( CAST(GETDATE() AS FLOAT ) ) AS DATETIME) AS 'DateTimeAtMidnight';

81voto

Alex Miller Points 28225

Vous pouvez aller à la Date->Calendrier->jeu->Date:

Date date = new Date();                      // timestamp now
Calendar cal = Calendar.getInstance();       // get calendar instance
cal.setTime(date);                           // set cal to date
cal.set(Calendar.HOUR_OF_DAY, 0);            // set hour to midnight
cal.set(Calendar.MINUTE, 0);                 // set minute in hour
cal.set(Calendar.SECOND, 0);                 // set second in minute
cal.set(Calendar.MILLISECOND, 0);            // set millis in second
Date zeroedDate = cal.getTime();             // actually computes the new Date

J'aime Java dates.

Notez que si vous utilisez réel java.sql.Les horodatages, elles ont un supplément de nanos champ. Calendrier des cours, ne sait rien de nanos sera donc aveuglément l'ignorer et efficacement le déposer lors de la création de la zeroedDate à la fin, que vous pouvez ensuite utiliser pour créer un nouveau Timetamp objet.

Je tiens également à noter que le Calendrier n'est pas thread-safe, n'allez pas penser que l'on peut en faire un statique unique cal instance appelée à partir de plusieurs threads pour éviter de créer de nouveaux Calendrier des instances.

19voto

ScArcher2 Points 22118

Si vous utilisez commons lang, vous pouvez appeler DateUtils.truncate . Voici la documentation javadoc .

C'est ce que @ Alex Miller a dit de faire.

7voto

thoroughly Points 467

En supposant que votre "horodatage" soit un java.util.Date, représenté par le nombre de millisecondes écoulées depuis le début de l'époque (le 1er janvier 1970), vous pouvez effectuer l'arithmétique suivante:

 public static Date stripTimePortion(Date timestamp) {
    long msInDay = 1000 * 60 * 60 * 24; // Number of milliseconds in a day
    long msPortion = timestamp.getTime() % msInDay;
    return new Date(timestamp.getTime() - msPortion);
}
 

4voto

Torben Kohlmeier Points 1028

Je préfère cette solution:

 GregorianCalendar now = new GregorianCalendar();
GregorianCalendar calendar = new GregorianCalendar(
              now.get(GregorianCalendar.YEAR), now.get(GregorianCalendar.MONTH), 
              now.get(GregorianCalendar.DAY_OF_MONTH));
 

4voto

Ziya Points 86

Faire ceci

 import org.apache.commons.lang.time.DateUtils;

Date myDate = new Date();
System.out.println(myDate);        
System.out.println(DateUtils.truncate(myDate, Calendar.DATE));
 

et la sortie est

Mer. 19 mars 14:16:47 PDT 2014
Mer. Mars 19 00:00:00 HAP 2014

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X