Comment obtenir l'horodatage actuel au format chaîne en Java? "Aaaa.MM.JJ.HH.mm.ss"

174

Comment obtenir un horodatage au format chaîne en Java? "aaaa.MM.JJ.HH.mm.ss"

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

C'est ce que j'ai, mais Timestamp () nécessite un paramètre ...

user3388884
la source
prepareStatement.setTimestamp (1, nouvel horodatage (System.currentTimeMillis ()));
Rajat
Quelle erreur obtenez vous?
Robert Columbia
Pour info, les anciennes classes de date-heure terriblement gênantes telles que SimpleDateFormatet java.sql.Timestampsont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir le didacticiel d'Oracle .
Basil Bourque

Réponses:

202

Remplacer

new Timestamp();

avec

new java.util.Date()

car il n'y a pas de constructeur par défaut pour Timestamp, ou vous pouvez le faire avec la méthode:

new Timestamp(System.currentTimeMillis());
Jigar Joshi
la source
5
Pour info, les anciennes classes de date-heure terriblement gênantes telles que java.util.Dateet java.sql.Timestampsont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir le didacticiel d'Oracle .
Basil Bourque
160

Utilisez la java.util.Dateclasse au lieu de l'horodatage.

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

Cela vous donnera la date actuelle dans le format spécifié.

dimoniie
la source
5
Cela m'a aidé et j'ai fait quelques changements pour ne pas avoir à importer new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni
Mieux new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon
36

tl; dr

Utilisez uniquement des classes java.time modernes . Ne jamais utiliser les classes terribles hérités tels que SimpleDateFormat, Dateou java.sql.Timestamp.

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

Ou utilisez le fuseau horaire par défaut actuel de la JVM .

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time et JDBC 4.2

L'approche moderne utilise les classes java.time comme vu ci-dessus.

Si votre pilote JDBC est conforme à JDBC 4.2 , vous pouvez directement échanger des objets java.time avec la base de données. Utilisez PreparedStatement::setObjectet ResultSet::getObject.

Utilisez java.sql uniquement pour les pilotes antérieurs à JDBC 4.2

Si votre pilote JDBC n'est pas encore conforme à JDBC 4.2 pour la prise en charge des types java.time , vous devez revenir à l'utilisation des classes java.sql.

Stocker des données.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject(  , odt ) ;

Récupération des données.

OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;

Les types java.sql, tels que java.sql.Timestamp, ne doivent être utilisés que pour le transfert vers et depuis la base de données. Conversion immédiate en types java.time dans Java 8 et versions ultérieures.

java.time.Instant

A java.sql.Timestampcorrespond à un java.time.Instant, un moment de la chronologie en UTC. Notez la nouvelle méthode de conversion toInstantajoutée à l'ancienne classe.

java.sql.Timestamp ts = myResultSet.getTimestamp(  );
Instant instant = ts.toInstant(); 

Fuseau horaire

Appliquez le fuseau horaire souhaité / attendu ( ZoneId) pour obtenir un fichier ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Chaînes formatées

Utilisez a DateTimeFormatterpour générer votre chaîne. Les codes de motif sont similaires à ceux de java.text.SimpleDateFormatmais pas exactement, alors lisez attentivement la documentation.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

Ce format particulier est ambigu quant à sa signification exacte car il ne dispose d'aucune indication de décalage par rapport à UTC ou de fuseau horaire.

ISO 8601

Si vous avez un mot à dire sur le sujet, je vous suggère d'envisager d'utiliser les formats standard ISO 8601 plutôt que de rouler les vôtres. Le format standard est assez similaire au vôtre. Par exemple:
2016-02-20T03:26:32+05:30.

Les classes java.time utilisent ces formats standard par défaut, il n'est donc pas nécessaire de spécifier un modèle. La ZonedDateTimeclasse étend le format standard en ajoutant le nom du fuseau horaire (une amélioration judicieuse).

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

Convertir en java.sql

Vous pouvez reconvertir de java.time vers java.sql.Timestamp. Extrait un Instantdu ZonedDateTime.

De nouvelles méthodes ont été ajoutées aux anciennes classes pour faciliter la conversion vers / depuis les classes java.time.

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

Tableau des types date-heure en Java (ancien et moderne) et en SQL standard


À propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date, Calendar, et SimpleDateFormat.

Le projet Joda-Time , maintenant en mode maintenance , conseille la migration vers les classes java.time .

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

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.*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 d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .

Basil Bourque
la source
Alors, quelle est la bonne façon d'obtenir l'horodatage actuel de l'horloge murale au format "aaaa.MM.dd.HH.mm.ss"? Sans spécifier explicitement la chaîne codée en dur de mon fuseau horaire local? C'est ce que demandait le sujet de départ, et je n'ai pas pu le trouver dans votre réponse ...
t7ko
@ t7ko J'ai ajouté une ligne d'exemple de code à la section tl; dr montrant comment demander explicitement le fuseau horaire par défaut actuel de la JVM. Appeler `now () 'sans aucun argument fait la même chose mais n'est pas clair si vous vouliez utiliser la valeur par défaut ou si vous étiez ignorant ou oubliez la question cruciale du fuseau horaire.
Basil Bourque
32

Vous pouvez utiliser java.util.Date au lieu de Timestamp:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
Kakarot
la source
6

Une approche plus appropriée consiste à spécifier une région Locale en tant que paramètre dans le constructeur. L'exemple ci-dessous utilise une région locale américaine. Le formatage de la date est sensible aux paramètres régionaux et utilise les paramètres régionaux pour personnaliser les informations relatives aux coutumes et aux conventions de la région de l'utilisateur Locale (Java Platform SE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());
user3144836
la source
1
Rien de tel que "Zone Locale". Je soupçonne que vous êtes déroutant Localeet que votre fuseau horaire n'est pas lié. Localecontrôle les normes culturelles pour le formatage et le langage humain utilisé pour le nom du mois / jour. Le fuseau horaire ajuste la représentation de la date et de l'heure en fonction de l'heure de l'horloge murale de certaines régions . Dans le cas de cette Question, les paramètres régionaux ne sont pas pertinents car il n'y a pas de problèmes de formatage avec lesquels appliquer les normes culturelles et il n'y a pas non plus de noms de mois / jour à localiser dans une langue humaine particulière.
Basile Bourque
@BasilBourque Merci pour votre contribution. J'ai mis à jour la réponse pour être plus explicite
user3144836
4

Vous pouvez utiliser ce qui suit

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

Result : 1539594988651

J'espère que cela aidera. Juste ma suggestion et pas pour les points de récompense.

Phénix
la source
Il n'a pas le format de chaîne demandé. J'ai aussi peur que la seule chose que cela ajoute à quelques réponses similaires, c'est une complication inutile…
Ole VV
4

Utilisez des java.timeclasses modernes si vous utilisez java 8 ou plus récent.

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

La réponse de Basil Bourque est plutôt bonne. Mais c'est trop long. Beaucoup de gens n'auraient pas la patience de le lire. Les 3 premières réponses sont trop anciennes et peuvent induire en erreur la nouvelle abeille de Java. Je fournis donc cette réponse courte et moderne pour les nouveaux développeurs à venir. J'espère que cette réponse peut réduire l'utilisation de terribles SimpleDateFormat.

gzc
la source