¿Cómo convertir java.util.Date a java.sql.Date?
datetime (17)
tl; dr
¿Cómo convertir java.util.Date a java.sql.Date?
No lo hagas Ambas clases están pasadas de moda.
- Utilice java.time clases java.time lugar de las heredadas
java.util.Date
&java.sql.Date
con JDBC 4.2 o posterior. - Convierta a / desde java.time si no está actualizado con java.time.
Consulta de ejemplo con 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.
)
Reemplazos:
-
Instant
lugar dejava.util.Date
Ambos representan un momento en UTC. pero ahora con nanosegundos en lugar de milisegundos. -
LocalDate
lugar dejava.sql.Date
Ambos representan un valor de solo fecha sin una hora del día y sin una zona horaria.
Detalles
Si está tratando de trabajar con valores de solo fecha (sin hora del día, sin zona horaria), use la clase LocalDate
lugar de java.util.Date
.
java.time
En Java 8 y versiones posteriores, el nuevo paquete java.time suplantó a las problemáticas antiguas clases de fecha y hora agrupadas con las primeras versiones de Java. Ver Tutorial de Oracle . Gran parte de la funcionalidad se ha adaptado a Java 6 y 7 en ThreeTen-Backport y se ha adaptado a Android en ThreeTenABP .
Un tipo de datos SQL DATE
está destinado a ser solo de fecha, sin hora del día y sin zona horaria. Java nunca tuvo precisamente tal clase † hasta LocalDate en Java 8. Vamos a crear ese valor obteniendo la fecha de hoy de acuerdo con una zona horaria particular (la zona horaria es importante para determinar una fecha como un nuevo día antes en París que en Montreal, por ejemplo).
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".
En este punto, podemos estar listos. Si su controlador JDBC cumple con la especificación JDBC 4.2 , debería poder pasar una fecha LocalDate
través de setObject
en una setObject
PreparedStatement
para almacenar en un campo de fecha de SQL.
myPreparedStatement.setObject( 1 , localDate );
Del mismo modo, use ResultSet::getObject
para obtener de una columna DATE de SQL a un objeto Java LocalDate
. Especificar la clase en el segundo argumento hace que su código sea type-safe .
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
En otras palabras, toda esta Cuestión es irrelevante bajo JDBC 4.2 o posterior.
Si su controlador JDBC no funciona de esta manera, necesita volver a convertir a los tipos java.sql.
Convertir a java.sql.Fecha
Para convertir, use nuevos métodos agregados a las antiguas clases de fecha y hora. Podemos llamar a java.sql.Date.valueOf(…)
para convertir una LocalDate
.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
Y yendo en la otra dirección.
LocalDate localDate = sqlDate.toLocalDate();
Convertir desde java.util.Date
Si bien debe evitar el uso de las antiguas clases de fecha y hora, se le puede forzar a que trabaje con el código existente. Si es así, puedes convertir a / desde java.time.
Ir a través de la clase Instant
, que representa un momento en la línea de tiempo en UTC. Un Instant
es similar en idea a un java.util.Date
. Pero tenga en cuenta que Instant
tiene una resolución de hasta nanoseconds mientras que java.util.Date
solo tiene una resolución de milliseconds .
Para convertir, utilice nuevos métodos añadidos a las clases antiguas. Por ejemplo, java.util.Date.from( Instant )
y java.util.Date::toInstant
.
Instant instant = myUtilDate.toInstant();
Para determinar una fecha, necesitamos el contexto de una zona horaria. Para un momento dado, la fecha varía alrededor del mundo por zona horaria. Aplica un ZoneId
para obtener un ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† La clase java.sql.Date pretende ser solo de fecha sin hora del día, pero en realidad es una hora del día, ajustada a la hora de la medianoche. ¿Confuso? Sí, las antiguas clases de fecha y hora son un desastre.
Acerca de java.time
El marco java.time está integrado en Java 8 y java.time posteriores. Estas clases sustituyen a las antiguas y problemáticas clases de fecha y hora como java.util.Date
, Calendar
y SimpleDateFormat
.
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busca Stack Overflow para muchos ejemplos y explicaciones. La especificación es JSR 310 .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cadenas, no se necesitan clases java.sql.*
.
¿Dónde obtener las clases java.time?
- Java SE 8 , Java SE 9 , Java SE 10 y posteriores
- Incorporado.
- Parte de la API de Java estándar con una implementación en paquete.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
- Android
- Versiones posteriores de las implementaciones de paquetes de Android de las clases java.time .
- Para Android anterior (<26), el proyecto ThreeTen-Backport adapta ThreeTen-Backport (mencionado anteriormente). Vea Cómo usar ThreeTenABP… .
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí como Interval
, YearWeek
, YearQuarter
, y more .
Estoy intentando usar un java.util.Date
como entrada y luego crear una consulta con él, así que necesito un java.sql.Date
.
Me sorprendió descubrir que no podía hacer la conversión implícita o explícitamente, pero ni siquiera sé cómo haría esto, ya que la API de Java todavía es bastante nueva para mí.
Aquí, el ejemplo de convertir la Fecha de Util a la Fecha del SQL y este es un ejemplo de lo que estoy usando en mi proyecto también podría ser útil para usted.
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)
Con la otra respuesta puede tener problemas con la información de tiempo (¡compare las fechas con resultados inesperados!)
Yo sugiero:
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);
Creo que la mejor manera de convertir es:
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 desea insertar la variable dt
en una tabla SQL, puede hacerlo:
insert into table (expireAt) values (''"+dt+"'');
En mi caso de escoger la fecha de JXDatePicker (calendario Java) y almacenarla en la base de datos como tipo de fecha SQL, a continuación funciona bien.
java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());
donde selectedDate es objeto de JXDatePicker
Esta función devolverá una fecha SQL convertida desde el objeto de fecha java.
public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
return new java.sql.Date(date.getTime());
}
Esta función devolverá una fecha SQL convertida desde el objeto de fecha 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;
}
Estaba intentando la siguiente codificación que funcionaba bien.
java.util.Date utilDate = new java.util.Date ();
java.sql.Date sqlDate = new java.sql.Date (utilDate);
Estoy usando el siguiente código por favor pruébelo
DateFormat fm= new SimpleDateFormatter();
especifique el formato de la fecha que desee, por ejemplo, "DD-MM_YYYY"
o ''YYYY-mm-dd''
luego use el tipo de datos de fecha java como
fm.format("object of java.util.date");
entonces analizará tu cita
Formato de su java.util.Date primero. Luego use la fecha formateada para obtener la fecha 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);
La conversión de java.util.Data
a java.sql.Data
perderá la hora, el minuto y el segundo. Entonces, si es posible, te sugiero que uses java.sql.Timestamp
como este:
prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime()));
Para más información, puedes consultar esta pregunta .
Método para comparar 2 fechas (util.date o 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;
}
No importa....
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);
}
}
lo explica El enlace es http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm
Puede utilizar este método para convertir la fecha de utilidad a la fecha de SQL,
DateUtilities.convertUtilDateToSql(java.util.Date)
Si está usando Mysql una columna de fecha se puede pasar una representación de cadena de esta fecha
así que estoy usando la clase DateFormatter para formatearlo y luego configurarlo como una cadena en la instrucción sql o preparada
Aquí está la ilustración del código:
private String converUtilDateToSqlDate(java.util.Date utilDate) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sqlDate = sdf.format(utilDate);
return sqlDate;
}
Fecha de cadena = converUtilDateToSqlDate (otherTransaction.getTransDate ());
// luego pasa esta fecha en tu declaración SQL
Soy un novato: después de mucho correr esto funcionó. El pensamiento puede ser útil
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
prueba con esto
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;
}