Comment convertir java.util.Date de java.SQL.Date?
j'essaie d'utiliser un java.util.Date
comme entrée et puis créer une requête avec elle - donc j'ai besoin d'un java.sql.Date
.
j'ai été surpris de constater qu'il ne pouvait pas faire la conversion implicitement ou explicitement - mais je ne sais même pas comment je le ferais, car L'API Java est encore assez nouvelle pour moi.
17 réponses
tl; dr
comment convertir java.util.Date de java.SQL.Date?
Don'T. les deux classes sont démodées.
- Utiliser de java.time classes au lieu de legacy
java.util.Date
&java.sql.Date
avec JDBC 4.2 ou plus tard. - Convertir vers/à partir de java.heure en cas d'interfonctionnement avec le code pas encore mis à jour en java.temps.
exemple de requête avec PreparedStatement
.
myPreparedStatement.setObject(
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)
remplacements:
-
Instant
au lieu dejava.util.Date
tous deux représentent un moment dans UTC. mais maintenant, avec nanosecondes au lieu de millisecondes. -
LocalDate
au lieu dejava.sql.Date
tous deux représentent une valeur de date seulement sans Heure de jour et sans fuseau horaire.
détails
si vous essayez de travailler avec des valeurs date-only (no time-of-day, no time zone), utilisez la classe LocalDate
plutôt que java.util.Date
.
de java.time
en Java 8 et plus tard, le gênant les anciennes classes de date-heure empaquetées avec les premières versions de Java ont été supplantées par le nouveau java.package . Voir Oracle Tutoriel . Une grande partie de la fonctionnalité a été rétroportée à Java 6 & 7 dans ThreeTen-Backport et adapté à Android dans ThreeTenABP .
UN type de données SQL DATE
est destiné à être date-seulement, sans l'heure de la journée et pas de temps horaire. Java n'a jamais eu exactement une telle classe† jusqu'à java.time.LocalDate
en Java 8. Créons une telle valeur en obtenant la date d'aujourd'hui en fonction d'un fuseau horaire particulier (le fuseau horaire est important pour déterminer une date car un nouveau jour se lève plus tôt à Paris qu'à Montréal, par exemple).
LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) ); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".
à ce point, nous pouvons être faits. Si votre conducteur JDBC est conforme à JDBC 4.2 spec , vous devriez être en mesure de passer un LocalDate
via setObject
sur un PreparedStatement
pour stocker dans un champ Date SQL.
myPreparedStatement.setObject( 1 , localDate );
de même, utilisez ResultSet::getObject
pour aller d'une colonne de DATE SQL à un objet Java LocalDate
. Spécifier la classe dans le deuxième argument rend votre code type-safe .
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
en d'autres termes, cette question entière n'est pas pertinente en vertu de JDBC 4.2 ou plus tard.
si votre pilote JDBC ne fonctionne pas de cette manière, vous devez vous replier sur la conversion en java.les types sql.
Convertissez en java.SQL.Date
pour convertir, utilisez de nouvelles méthodes ajoutées aux anciennes classes de date-heure. Nous pouvons appeler java.sql.Date.valueOf(…)
pour convertir un LocalDate
.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
Et aller dans l'autre direction.
LocalDate localDate = sqlDate.toLocalDate();
conversion de java.util.Date
bien que vous devriez éviter d'utiliser les anciennes classes de date-heure, vous pouvez être forcé de le faire lorsque vous travaillez avec du code existant. Si c'est le cas, vous pouvez convertir en/à partir de java.temps.
passer par la classe Instant
, qui représente un moment sur la ligne de temps en UTC. Un Instant
est similaire dans l'idée d'un java.util.Date
. Mais notez que Instant
a une résolution jusqu'à nanosecondes tandis que java.util.Date
a seulement millisecondes résolution.
pour convertir, utilisez de nouvelles méthodes ajoutées aux anciennes classes. Par exemple:, java.util.Date.from( Instant )
et java.util.Date::toInstant
.
Instant instant = myUtilDate.toInstant();
pour déterminer une date, nous avons besoin du contexte d'un fuseau horaire. Pour tout moment, la date varie autour du globe par fuseau horaire. Appliquer un ZoneId
pour obtenir un ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† la java.SQL.Classe de Date prétend être date-seulement sans une heure de la journée, mais en fait fait une heure de la journée, ajustée à une heure de minuit. Déroutant? Oui, les vieux cours de datation sont un gâchis.
à propos de java.heure
Le de java.time framework est construit dans Java 8 et plus tard. Ces classes remplacent les anciennes classes de date legacy telles que java.util.Date
, Calendar
, & SimpleDateFormat
.
le Joda-Time projet, maintenant dans mode de maintenance , conseille la migration vers le java.temps classes.
pour en savoir plus, voir le Oracle Tutorial . Et rechercher le débordement de la pile pour de nombreux exemples et explications. La spécification est JSR 310 .
vous pouvez échanger java.temps objets directement avec votre base de données. Utilisez un JDBC driver conforme à JDBC 4.2 ou plus tard. Pas besoin de Chaînes, pas besoin de classes java.sql.*
.
où obtenir le java.les classes de temps?
- Java SE 8 , Java SE 9 , Java SE 10 , et plus tard
- Built-in.
- fait partie de L'API Java standard avec une implémentation groupée.
- Java 9 ajoute des fonctionnalités mineures et des corrections.
- Java SE 6 et Java SE 7
- une grande partie de la java.temps la fonctionnalité est rétroportée à Java 6 & 7 dans ThreeTen-Backport .
- Android
- versions ultérieures des implémentations du paquet Android de la java.temps classes.
- pour Android plus tôt (<26), le ThreeTenABP "1519580920 projet" s'adapte ThreeTen-Backport (mentionné ci-dessus). Voir comment utiliser ThreeTenABP... .
ThreeTen-Extra " le projet étend java.temps avec des cours supplémentaires. Ce le projet est un terrain d'essai pour d'éventuelles futures additions à java.temps. Vous pouvez trouver ici quelques cours utiles tels que: Interval
, YearWeek
, YearQuarter
, et plus .
peu importe....
public class MainClass {
public static void main(String[] args) {
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
System.out.println("utilDate:" + utilDate);
System.out.println("sqlDate:" + sqlDate);
}
}
explique. Le lien est http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm
avec l'autre réponse, vous pourriez avoir des problèmes avec les informations de temps (comparez les dates avec des résultats inattendus!)
je suggère:
java.util.Calendar cal = Calendar.getInstance();
java.util.Date utilDate = new java.util.Date(); // your util date
cal.setTime(utilDate);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
java.sql.Date sqlDate = new java.sql.Date(cal.getTime().getTime()); // your sql date
System.out.println("utilDate:" + utilDate);
System.out.println("sqlDate:" + sqlDate);
cette fonction renvoie une date SQL convertie à partir de l'objet Date java.
public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
return new java.sql.Date(date.getTime());
}
convertissant java.util.Data
en java.sql.Data
perdra l'heure,la minute et la seconde. Donc, si c'est possible, je vous suggère d'utiliser java.sql.Timestamp
comme ceci:
prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime()));
pour plus d'information, vous pouvez cocher cette question .
dans mon cas de choisir la date de JXDatePicker (Java calender) et de l'obtenir stocké dans la base de données comme type de date SQL, ci-dessous fonctionne très bien ..
java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());
où pickedDate est objet de JXDatePicker
cette fonction renvoie une date SQL convertie à partir de l'objet Date java.
public static java.sql.Date convertFromJAVADateToSQLDate(
java.util.Date javaDate) {
java.sql.Date sqlDate = null;
if (javaDate != null) {
sqlDate = new Date(javaDate.getTime());
}
return sqlDate;
}
formater votre java.util.Date de première. Ensuite, utilisez la date formatée pour obtenir la date en java.SQL.Date
java.util.Date utilDate = "Your date"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
final String stringDate= dateFormat.format(utilDate);
final java.sql.Date sqlDate= java.sql.Date.valueOf(stringDate);
Voici l'exemple de la conversion de la Date Util en date Sql et ya c'est un exemple ce que j'utilise dans mon projet pourrait être utile pour vous aussi.
java.util.Date utilStartDate = table_Login.getDob();(orwhat ever date your give form obj)
java.sql.Date sqlStartDate = new java.sql.Date(utilStartDate.getTime());(converting date)
je suis un novice: après beaucoup de course autour de cela a fonctionné. Pensé pourrait être utile
String bufDt = bDOB.getText(); //data from form
DateFormat dF = new SimpleDateFormat("dd-MM-yyyy"); //data in form is in this format
Date bbdt = (Date)dF.parse(bufDt); // string data is converted into java util date
DateFormat dsF = new SimpleDateFormat("yyyy-MM-dd"); //converted date is reformatted for conversion to sql.date
String ndt = dsF.format(bbdt); // java util date is converted to compatible java sql date
java.sql.Date sqlDate= java.sql.Date.valueOf(ndt); // finally data from the form is convered to java sql. date for placing in database
Méthode pour comparer 2 dates (util.date ou sql.date)
public static boolean isSameDay(Date a, Date b) {
Calendar calA = new GregorianCalendar();
calA.setTime(a);
Calendar calB = new GregorianCalendar();
calB.setTime(b);
final int yearA = calA.get(Calendar.YEAR);
final int monthA = calA.get(Calendar.MONTH);
final int dayA = calA.get(Calendar.DAY_OF_YEAR);
final int yearB = calB.get(Calendar.YEAR);
final int monthB = calB.get(Calendar.MONTH);
final int dayB = calB.get(Calendar.DAY_OF_YEAR);
return yearA == yearB && monthA == monthB && dayA == dayB;
}
essayez avec cette
public static String toMysqlDateStr(Date date) {
String dateForMySql = "";
if (date == null) {
dateForMySql = null;
} else {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateForMySql = sdf.format(date);
}
return dateForMySql;
}
je pense que la meilleure façon de convertir est:
static java.sql.Timestamp SQLDateTime(Long utilDate) {
return new java.sql.Timestamp(utilDate);
}
Date date = new Date();
java.sql.Timestamp dt = SQLDateTime(date.getTime());
si vous voulez insérer la variable dt
dans une table SQL vous pouvez faire:
insert into table (expireAt) values ('"+dt+"');
j'utilise le code suivant s'il vous plaît essayer
DateFormat fm= new SimpleDateFormatter();
spécifiez le format de la date que vous voulez
par exemple "DD-MM_YYYY"
ou 'YYYY-mm-dd'
puis utiliser le type de données java Date comme
fm.format("object of java.util.date");
puis il analysera votre date
vous pouvez utiliser cette méthode pour convertir la date util en date sql,
DateUtilities.convertUtilDateToSql(java.util.Date)
j'ai essayé le codage suivant qui a bien fonctionné.
de java.util.Date utilDate = new java.util.Date ();
java.SQL.Date sqlDate = new java.SQL.Date (utilDate);
si vous êtes usgin Mysql une colonne de date peut être passée une représentation de chaîne de caractères de cette date
donc j'utilise la classe DateFormatter pour la formater et la définir comme une chaîne dans la déclaration sql ou la déclaration préparée
voici l'illustration du code:
private String converUtilDateToSqlDate(java.util.Date utilDate) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sqlDate = sdf.format(utilDate);
return sqlDate;
}
String date = converUtilDateToSqlDate (otherTransaction.getTransDate ());
/ / passez ensuite cette date dans votre déclaration sql