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
newTimestamp();
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:
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.
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 .
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 );
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.
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.
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).
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.
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 .
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:
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)
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.
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.
SimpleDateFormat
etjava.sql.Timestamp
sont 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 .Réponses:
Remplacer
avec
car il n'y a pas de constructeur par défaut pour
Timestamp
, ou vous pouvez le faire avec la méthode:la source
java.util.Date
etjava.sql.Timestamp
sont 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 .Utilisez la
java.util.Date
classe au lieu de l'horodatage.Cela vous donnera la date actuelle dans le format spécifié.
la source
new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date())
;tl; dr
Utilisez uniquement des classes java.time modernes . Ne jamais utiliser les classes terribles hérités tels que
SimpleDateFormat
,Date
oujava.sql.Timestamp
.Ou utilisez le fuseau horaire par défaut actuel de la JVM .
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::setObject
etResultSet::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.
Récupération des données.
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.Timestamp
correspond à unjava.time.Instant
, un moment de la chronologie en UTC. Notez la nouvelle méthode de conversiontoInstant
ajoutée à l'ancienne classe.Fuseau horaire
Appliquez le fuseau horaire souhaité / attendu (
ZoneId
) pour obtenir un fichierZonedDateTime
.Chaînes formatées
Utilisez a
DateTimeFormatter
pour générer votre chaîne. Les codes de motif sont similaires à ceux dejava.text.SimpleDateFormat
mais pas exactement, alors lisez attentivement la documentation.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
ZonedDateTime
classe étend le format standard en ajoutant le nom du fuseau horaire (une amélioration judicieuse).Convertir en java.sql
Vous pouvez reconvertir de java.time vers
java.sql.Timestamp
. Extrait unInstant
duZonedDateTime
.De nouvelles méthodes ont été ajoutées aux anciennes classes pour faciliter la conversion vers / depuis les classes java.time.
À 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
, etSimpleDateFormat
.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
,YearQuarter
et plus .la source
Vous pouvez utiliser java.util.Date au lieu de Timestamp:
la source
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)
la source
Locale
et que votre fuseau horaire n'est pas lié.Locale
contrô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.Vous pouvez utiliser ce qui suit
J'espère que cela aidera. Juste ma suggestion et pas pour les points de récompense.
la source
Utilisez des
java.time
classes modernes si vous utilisez java 8 ou plus récent.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
.la source