web-dev-qa-db-fra.com

Comment formater un horodatage Java.sql (aaaa-MM-jj HH: mm: ss.S) en une date (aaaa-MM-jj HH: mm: ss)

Eh bien, j'ai un détail en utilisant un Date, parce que je reçois un objet de ma base de données et dans la variable "fecha" (date) de ce même objet, je reçois un Java.sql.Timestamp, donc le format est en millisecondes, mais je ne veux pas que les millisecondes apparaissent. J'ai donc besoin de formater la date que je reçois de ma base de données en une nouvelle date qui n'a pas de millisecondes.

C'est l'objet Factura:

public class Factura  implements Java.io.Serializable {

 private FacturaId id;
 ...
 private boolean activo;
 private Date fecha;
}

Dans le xml qui est mappé à la base de données, j'ai ce code pour cette variable "fecha":

<property name="fecha" type="timestamp">
  <column length="19" name="fecha" not-null="true"/>
</property>

Dans la base de données, cette colonne est fecha DATETIME.

Et quand je reçois un objet Factura de ma base de données, je reçois ce genre de date 2013-10-10 10:49:29.0 mais je le veux sans le .0 (millisecondes).

J'ai essayé ceci (factura est l'objet Factura):

try {
   SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   Date fechaNueva = null;
   String fechaStr = factura.getFecha().toString();
   int tamaño = fechaStr.length()-2;
   fechaStr = fechaStr.substring(0, tamaño); //I get a string without the miliseconds
   fechaNueva = format.parse(fechaStr);
} catch(ParseException ex) {
   ...
}

Mais fechaNueva me donne Thu Oct 10 10:49:29 CDT 2013 et je veux seulement 2013-10-10 10:49:29, Pouvez-vous m'aider s'il vous plaît?

Merci beaucoup d'avance.

8
user2284257

Vous n'avez pas du tout besoin d'utiliser de sous-chaîne car votre format ne contient pas cette information.

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String fechaStr = "2013-10-10 10:49:29.10000";  
Date fechaNueva = format.parse(fechaStr);

System.out.println(format.format(fechaNueva)); // Prints 2013-10-10 10:49:29
16
Sajal Dutta

Un objet date-heure n'est pas une chaîne

La classe Java.sql.Timestamp n'a pas de format. Sa méthode toString génère une chaîne avec un format.

Ne confondez pas un objet date-heure avec une chaîne qui peut représenter sa valeur. Un objet date-heure peut analyser des chaînes et générer des chaînes mais n'est pas lui-même une chaîne.

Java.time

Commencez par convertir les anciennes classes de date et heure héritées en difficulté en classes Java.time. Utilisez les nouvelles méthodes ajoutées aux anciennes classes.

Instant instant = mySqlDate.toInstant() ;

Perdez la fraction de seconde dont vous ne voulez pas.

instant = instant.truncatedTo( ChronoUnit.Seconds );

Attribuez le fuseau horaire à ajuster à partir de l'UTC utilisé par Instant.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z );

Générez une chaîne proche de la sortie souhaitée. Remplacez son T au milieu par un ESPACE.

DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_DATE_TIME ;
String output = zdt.format( f ).replace( "T" , " " );
3
Basil Bourque