web-dev-qa-db-fra.com

Comment convertir Java.util.Date en Java.sql.Date?

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.

424
David Ackerman

tl; dr

Comment convertir Java.util.Date en Java.sql.Date?

Ne pas. Les deux classes sont obsolètes.

  • Utilisez les classes Java.time à la place de l'héritage _Java.util.Date_ & _Java.sql.Date_ avec JDBC 4.2 ou version ultérieure.
  • Convertir vers/à partir de Java.time si le code n'est pas encore mis à jour vers Java.time.

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_
    Les deux représentent un moment en UTC. mais maintenant avec des nanosecondes au lieu de millisecondes.
  • _ { LocalDate au lieu de _Java.sql.Date_
    Les deux représentent une valeur de date uniquement sans heure et sans fuseau horaire.

Détails

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 .

Table of date-time types in Java (both legacy and modern) and in the SQL standard.

Java.time

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.

Convertir en Java.sql.Date

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();
_

Conversion de _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.


À propos de Java.time

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 .

60
Basil Bourque

Ç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

462
David Ackerman

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);
38
mauretto

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());
}
24
chetan

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 .

18
shellbye

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

13
jack jay

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;
    }
5
Tanmay kumar shaw

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);
3
hackfield

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)
2
Krishna

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
2
PKSawmy

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;
}
1
Donovan Thomson
Java.sql.Date sqlDate = new Java.sql.Date(javaDate.getTime());

Ici javaDate est l'instance de Java.util.Date

1
Rajeev Ranjan

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;
}
0
kapil das