web-dev-qa-db-fra.com

Comment supprimer des millisecondes du format d'objet de date dans Java

Depuis le Java.util.Date l'objet stocke la date sous la forme 2014-01-24 17:33:47.214, mais je veux que le format de la date soit 2014-01-24 17:33:47. Je veux supprimer la partie en millisecondes.

J'ai vérifié une question liée à ma question ...

Comment supprimer la partie sous-secondes de l'objet Date

J'ai essayé la réponse donnée

long time = date.getTime();
date.setTime((time / 1000) * 1000);

mais j'ai le format de date de mon résultat comme 2014-01-24 17:33:47.0. Comment puis-je supprimer ce 0 de mon format de date ???

14
Ankit Lamba

La réponse de base est, vous ne pouvez pas. La valeur renvoyée par Date#toString est une représentation de l'objet Date et il ne comporte aucun concept de format autre que celui qu'il utilise en interne pour la méthode toString.

En général, cela ne doit pas être utilisé à des fins d'affichage (sauf en de rares occasions)

Au lieu de cela, vous devriez utiliser une sorte de DateFormat

Par exemple...

Date date = new Date();
System.out.println(date);
System.out.println(DateFormat.getDateTimeInstance().format(date));
System.out.println(DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date));
System.out.println(DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(date));
System.out.println(DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(date));

Sortira quelque chose comme ...

Thu Jan 30 16:29:31 EST 2014
30/01/2014 4:29:31 PM
30/01/14 4:29 PM
30/01/2014 4:29:31 PM
30 January 2014 4:29:31 PM

Si vous êtes vraiment bloqué, vous pouvez le personnaliser davantage en utilisant un SimpleDateFormat , mais j'éviterais cela si vous le pouvez, car tout le monde n'utilise pas le même format de date/heure;)

10
MadProgrammer

tl; dr

Coupez la fraction de seconde.

myJavaUtilDate.toInstant()                         // Convert from legacy class to modern class. Returns a `Instant` object.
              .truncatedTo( ChronoUnit.SECONDS )   // Generate new `Instant` object based on the values of the original, but chopping off the fraction-of-second.

Masquez la fraction de seconde lors de la génération d'un String.

myJavaUtilDate.toInstant()                         // Convert from legacy class to modern class. Returns a `Instant` object.
              .atOffset( ZoneOffset.UTC )          // Return a `OffsetDateTime` object. 
              .format( DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ) ). // Ask the `OffsetDateTime` object to generate a `String` with text representing its value, in a format defined in the `DateTimeFormatter` object.

Évitez les anciennes classes de date et d'heure

Vous utilisez d'anciennes classes de date-heure gênantes, désormais héritées, supplantées par les classes Java.time.

Instant

Convertissez votre ancien Java.util.Date s'oppose à un Java.time.Instant en appelant une nouvelle méthode ajoutée à l'ancienne classe.

Instant instant = myJavaUtilDate.toInstant() ;

Table of types of date-time classes in modern Java.time versus legacy.

Tronquer

Si vous souhaitez modifier la valeur des données elles-mêmes pour supprimer la fraction de seconde, vous pouvez tronquer. Les classes Java.time utilisent objets immuables , nous générons donc un nouvel objet plutôt que de modifier (muter) l'original.

Instant instantTruncated = instant.truncatedTo( ChronoUnit.SECONDS );

Génération d'une chaîne

Si, au lieu de tronquer, vous souhaitez simplement supprimer l'affichage des secondes fractionnaires lors de la génération d'une chaîne représentant la valeur date-heure, définissez un formateur adapté à vos besoins.

Par exemple, "uuuu-MM-jj HH: mm: ss" ne fait aucune mention d'une fraction de seconde, de sorte que les millisecondes contenues dans les données n'apparaissent tout simplement pas dans la chaîne générée.

Convertissez Instant en OffsetDateTime pour un formatage plus flexible.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC )
String output = odt.format( f );

Fuseau horaire

Notez que votre question ignore le problème du fuseau horaire. Si vous avez l'intention d'utiliser UTC, le code ci-dessus fonctionne car Date et Instant sont par définition en UTC. Si, au contraire, vous voulez percevoir les données données à travers la lentille d'une région heure de l'horloge murale , appliquez un fuseau horaire. Recherche de débordement de pile pour les noms de classe ZoneId et ZonedDateTime pour beaucoup plus d'informations.


À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent l'ancien hérité classes date-heure telles que Java.util.Date , Calendar , & SimpleDateFormat .

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers Java.time = classes.

Pour en savoir plus, consultez le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 31 .

Vous pouvez échanger des objets Java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de Java.sql.* Des classes.

Où obtenir les classes Java.time?

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à Java.time. Vous pouvez trouver ici des classes utiles telles que Interval , YearWeek , YearQuarter , et plus .

20
Basil Bourque

Vous pouvez utiliser SimpleDateFormatter. Veuillez consulter le code suivant.

SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");
Date now = date.getTime();
System.out.println(formatter.format(now));
5
Mayur

Utilisez DateUtils d'Apache:

import org.Apache.commons.lang.time.DateUtils;
...
DateUtils.truncate(new Date(), Calendar.SECOND)
4
Scott White

Tronquer en secondes (sans millisecondes), renvoyer une nouvelle date:

public Date truncToSec(Date date) {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.MILLISECOND, 0);
    Date newDate = c.getTime();
    return newDate;
}
0
gene b.

Vous pouvez utiliser la classe SimpleDateFormat pour formater la date si nécessaire. En raison de la diversité des combinaisons possibles, je vais simplement inclure le lien de documentation ici:

http://docs.Oracle.com/javase/7/docs/api/Java/text/SimpleDateFormat.html

Votre code ressemblera à quelque chose comme ceci:

System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(date));
0
John Bergman

Juste pour mémoire, la réponse acceptée donnée au poste que vous avez lié fonctionne:

public static void main(String[] args) {
       SimpleDateFormat df = new SimpleDateFormat("S");
       Date d = new Date();
       System.out.println(df.format(d));
       Calendar c = Calendar.getInstance();
       c.set(Calendar.MILLISECOND, 0);
       d.setTime(c.getTimeInMillis());
       System.out.println(df.format(d));

}
0
Bernat