J'essaie d'utiliser Java.util.Date
comme entrée, puis de créer une requête avec elle. Il me faut donc un Java.sql.Date
.
J'ai été surpris de constater qu'il ne pouvait pas effectuer la conversion implicitement ou explicitement - mais je ne sais même pas comment je procéderais, car l'API Java est encore assez nouvelle pour moi.
Comment convertir Java.util.Date en Java.sql.Date?
Ne pas. Les deux classes sont obsolètes.
Java.util.Date
_ & _Java.sql.Date
_ avec JDBC 4.2 ou version ultérieure.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.
)
_
Remplaçants:
Instant
au lieu de _Java.util.Date
_LocalDate
au lieu de _Java.sql.Date
_Si vous essayez de travailler avec des valeurs de date uniquement (pas d'heure, pas de fuseau horaire), utilisez la classe LocalDate
plutôt que Java.util.Date
.
Dans Java 8 et versions ultérieures, les anciennes classes de date-heure problématiques fournies avec les premières versions de Java ont été remplacées par le nouveau package Java.time . Voir Tutoriel Oracle . Une grande partie de la fonctionnalité a été rétroportée vers Java 6 & 7 dans ThreeTen-Backport et davantage adaptée pour Android dans ThreeTenABP .
Un type de données SQL } _ DATE
est censé être une date uniquement, sans heure ni fuseau horaire. Java n'a jamais eu précisément une telle classe † jusqu'à Java.time.LocalDate
dans Java 8. Créons cette valeur en obtenant la date du jour selon une heure donnée zone (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 stade, nous pouvons avoir terminé. Si votre pilote JDBC _ est conforme à JDBC 4.2 spec , vous devriez pouvoir passer un LocalDate
via setObject
sur un PreparedStatement
dans lequel vous souhaitez enregistrer un champ SQL DATE.
_myPreparedStatement.setObject( 1 , localDate );
_
De même, utilisez ResultSet::getObject
pour extraire d'une colonne SQL DATE vers un objet Java LocalDate
. Spécifier la classe dans le deuxième argument rend votre code sécuritaire pour le type .
_LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
_
En d’autres termes, l’ensemble de la question n’est pas pertinent sous JDBC 4.2 ou ultérieur.
Si votre pilote JDBC ne fonctionne pas de cette manière, vous devez revenir à la conversion en types Java.sql.
Pour convertir, utilisez les nouvelles méthodes ajoutées aux anciennes classes 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 sens.
_LocalDate localDate = sqlDate.toLocalDate();
_
Java.util.Date
_Bien que vous devriez éviter d'utiliser les anciennes classes date-heure, vous pouvez être obligé de travailler avec du code existant. Si tel est le cas, vous pouvez convertir vers/à partir de Java.time.
Parcourez la classe Instant
, qui représente un moment sur la timeline en UTC. Instant
est une idée similaire à un _Java.util.Date
_. Mais notez que Instant
a une résolution allant jusqu'à nanosecondes alors que _Java.util.Date
_ n'a qu'une résolution de millisecondes .
Pour convertir, utilisez les 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 un moment donné, la date varie dans le monde entier par fuseau horaire. Appliquez un ZoneId
pour obtenir un ZonedDateTime
.
_ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
_
† La classe Java.sql.Date prétend être une date uniquement sans heure, mais en réalité fait une heure ajustée à minuit. Déroutant? Oui, les anciennes classes de date-heure sont un désordre.
Le cadre Java.time est intégré à partir de Java 8. Ces classes supplantent les anciennes anciennes } _ _ (héritées) problématiques, telles que Java.util.Date
, Calendar
_, & SimpleDateFormat
.
Le projet Joda-Time , désormais en mode { mode maintenance }, conseille la migration vers les classes Java.time .
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 une 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 ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval
_, YearWeek
, YearQuarter
, et plus .
Ça ne fait rien....
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);
}
}
l'explique. Le lien est http://www.Java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm
Avec l'autre réponse, vous pouvez 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 renverra une date SQL convertie à partir de l'objet Java date.
public Java.sql.Date convertJavaDateToSqlDate(Java.util.Date date) {
return new Java.sql.Date(date.getTime());
}
La conversion de Java.util.Data
en Java.sql.Data
perdra les heures, les minutes et les secondes. 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'informations, vous pouvez vérifier cette question .
Dans mon cas, choisir la date dans JXDatePicker (calendrier Java) et la stocker dans la base de données en tant que type de date SQL, fonctionne bien ci-dessous.
Java.sql.Date date = new Java.sql.Date(pickedDate.getDate().getTime());
où pickDate est l'objet de JXDatePicker
Cette fonction renverra une date SQL convertie à partir de l'objet Java date.
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;
}
Formatez d'abord votre Java.util.Date. Puis utilisez la date formatée pour obtenir la date dans 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 Date d'utilisation en date SQL et voici un exemple de ce que j'utilise dans mon projet pourrait vous être utile.
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 novice: après avoir beaucoup travaillé, cela a fonctionné. La pensée 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 de comparaison de 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;
}
Java.sql.Date sqlDate = new Java.sql.Date(javaDate.getTime());
Ici javaDate est l'instance de Java.util.Date
essayer avec ça
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;
}