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.

392
demandé sur Basil Bourque 2009-02-10 00:16:18

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 de java.util.Date

    tous deux représentent un moment dans UTC. mais maintenant, avec nanosecondes au lieu de millisecondes.
  • LocalDate au lieu de java.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?

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 .

40
répondu Basil Bourque 2018-08-03 18:30:15

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

444
répondu David Ackerman 2009-02-09 21:18:40

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);
38
répondu mauretto 2014-05-22 06:38:47

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());
}
23
répondu chetan 2014-02-18 15:50:13

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 .

17
répondu shellbye 2017-05-23 12:10:28

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

11
répondu jack jay 2016-09-09 14:20:33

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;
    }
5
répondu Tanmay kumar shaw 2014-12-23 10:49:22

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);
3
répondu hackfield 2016-02-16 14:58:54

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)
2
répondu Krishna 2013-09-24 10:40:02

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
2
répondu PKSawmy 2016-06-27 08:15:24

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;
}
1
répondu Donovan Thomson 2013-06-14 08:38:34

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;
}
0
répondu kapil das 2013-10-04 12:48:20

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+"');
-1
répondu user6043502 2016-03-23 17:35:55

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

-3
répondu UmeshA 2013-12-12 18:40:12

vous pouvez utiliser cette méthode pour convertir la date util en date sql,

DateUtilities.convertUtilDateToSql(java.util.Date)
-3
répondu Emmanuel Angelo.R 2015-04-02 05:58:04

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

-4
répondu PONRAJ 2016-08-26 12:03:36

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

-8
répondu Benjamin Ndugga 2012-06-25 21:36:52