145 votes

Régler l'heure sur 00:00:00

J'ai un problème de réinitialisation des heures dans Java. Pour une date donnée, je veux régler les heures à 00:00:00.

Voici mon code :

/**
     * Resets milliseconds, seconds, minutes and hours from the provided date
     *
     * @param date
     * @return
     */
    public static Date trim(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR, 0);

        return calendar.getTime();
    }

Le problème est que parfois le temps est 12:00:00 et parfois c'est 00:00:00 et quand j'interroge la base de données pour une entité qui a été sauvegardée le 07.02.2013 00:00:00 et le temps réel de l'entité, qui est stocké, est 12:00:00 la requête échoue.

Je sais que 12:00:00 == 00:00:00 !

J'utilise AppEngine. S'agit-il d'un bogue, d'un problème ou d'un autre problème lié à Appengine ? Ou cela dépend-il d'autre chose ?

242voto

rgettman Points 74908

Utilisez une autre constante à la place de Calendar.HOUR utiliser Calendar.HOUR_OF_DAY .

calendar.set(Calendar.HOUR_OF_DAY, 0);

Calendar.HOUR utilise 0-11 (pour une utilisation avec AM/PM), et Calendar.HOUR_OF_DAY utilise 0-23.

Pour citer les Javadocs :

public static final int HOUR

Numéro de champ pour l'indication get et set l'heure du matin ou de l'après-midi. HOUR est utilisé pour l'horloge de 12 heures 12 heures (0 - 11). Midi et minuit sont représentés par 0 et non par 12. Par exemple, à 10:04:15.250 PM, l'HEURE est 10.

et

public static final int HOUR_OF_DAY

Numéro de champ pour get et set indiquant l'heure du jour. HOUR_OF_DAY est utilisé pour l'horloge de 24 heures. 24 heures. Par exemple, à 10:04:15.250 PM, HOUR_OF_DAY est 22.

Test ("maintenant" est actuellement vers 14:55 le 23 juillet 2013, heure avancée du Pacifique) :

public class Main
{
   static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        now.set(Calendar.HOUR, 0);
        now.set(Calendar.MINUTE, 0);
        now.set(Calendar.SECOND, 0);
        System.out.println(sdf.format(now.getTime()));
        now.set(Calendar.HOUR_OF_DAY, 0);
        System.out.println(sdf.format(now.getTime()));
    }
}

Sortie :

$ javac Main.java
$ java Main
2013-07-23 12:00:00
2013-07-23 00:00:00

41voto

Przemek Points 5682

Java.time

Utilisation de la java.time intégré à Java 8 et aux versions ultérieures. Voir Tutoriel .

import java.time.LocalTime;
import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now(); # 2015-11-19T19:42:19.224
# start of a day
now.with(LocalTime.MIN); # 2015-11-19T00:00
now.with(LocalTime.MIDNIGHT); # 2015-11-19T00:00

Si vous n'avez pas besoin de l'heure du jour (parties heure, minute, seconde, etc.), envisagez d'utiliser la fonction LocalDate classe.

LocalDate.now(); # 2015-11-19

15voto

Voici quelques fonctions utilitaires que j'utilise à cette fin.

/**
 * sets all the time related fields to ZERO!
 *
 * @param date
 *
 * @return Date with hours, minutes, seconds and ms set to ZERO!
 */
public static Date zeroTime( final Date date )
{
    return DateTimeUtil.setTime( date, 0, 0, 0, 0 );
}

/**
 * Set the time of the given Date
 *
 * @param date
 * @param hourOfDay
 * @param minute
 * @param second
 * @param ms
 *
 * @return new instance of java.util.Date with the time set
 */
public static Date setTime( final Date date, final int hourOfDay, final int minute, final int second, final int ms )
{
    final GregorianCalendar gc = new GregorianCalendar();
    gc.setTime( date );
    gc.set( Calendar.HOUR_OF_DAY, hourOfDay );
    gc.set( Calendar.MINUTE, minute );
    gc.set( Calendar.SECOND, second );
    gc.set( Calendar.MILLISECOND, ms );
    return gc.getTime();
}

14voto

thorinkor Points 195

Encore une façon de JAVA 8 :

LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS);

Mais il est beaucoup plus utile de modifier la date qui existe déjà.

6voto

Ben Points 61

Voir le code ci-dessous :

    String datePattern24Hrs = "yyyy-MM-dd HH:mm:ss";
    String datePattern12Hrs = "yyyy-MM-dd hh:mm:ss";

    SimpleDateFormat simpleDateFormat24Hrs = new SimpleDateFormat(datePattern24Hrs);
    SimpleDateFormat simpleDateFormat12Hrs = new SimpleDateFormat(datePattern12Hrs);

    Date dateNow = new Date();
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(dateNow);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    Date dateTime = calendar.getTime();

    String dateTimeIn24Hrs = simpleDateFormat24Hrs.format(dateTime);
    String dateTimeIn12Hrs = simpleDateFormat12Hrs.format(dateTime);

    System.out.println("DateTime in 24Hrs: ".concat(dateTimeIn24Hrs));
    System.out.println("DateTime in 12Hrs: ".concat(dateTimeIn12Hrs));

Le résultat attendu est le suivant :

  • DateTime en 24Hrs : 2021-06-29 00:00:00
  • DateTime en 12Hrs : 2021-06-29 12:00:00

J'espère que cela vous aidera à trouver la réponse que vous cherchez.

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