Foros del Web » Programación para mayores de 30 ;) » Java »

pasar String a Date

Estas en el tema de pasar String a Date en el foro de Java en Foros del Web. Hola, tengo un campo fecha en una página jsp, que pasa como String a un Action (estoy utilizando struts2). Pero necesito pasar ese String de ...
  #1 (permalink)  
Antiguo 14/10/2009, 10:22
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
pasar String a Date

Hola, tengo un campo fecha en una página jsp, que pasa como String a un Action (estoy utilizando struts2). Pero necesito pasar ese String de una fecha a un objeto tipo Date, para luego compararlo con un campo Date de un VO. He intentado lo siguiente:

Date fecha = new Date();
Calendar cal = Calendar.getInstance();
fecha = cal.getTime();
DateFormat formatoFecha = new SimpleDateFormat ("dd/MM/yyyy HH:mm");
String textoFecha = formatoFecha.format(fecha);
try {
fecha = formatoFecha.parse(textoFecha);
} catch (Exception e) {
throw new SpringServiceException(e);
}

Pero ésto solo me pone en textoFecha un string con la fecha de hoy, y en fecha nada. ¿Alguien puede ayudarme? Hay alguna manera de pasar un objeto tipo String a Date, ya en la jsp, ya en el Action? Muchas gracias, un saludo
  #2 (permalink)  
Antiguo 14/10/2009, 11:33
Avatar de DiabloGuardian  
Fecha de Ingreso: noviembre-2008
Ubicación: Hidalgo
Mensajes: 215
Antigüedad: 15 años, 5 meses
Puntos: 3
Respuesta: pasar String a Date

otra forma e convertir un string a Date es usando la clase java.sql.Date

java.sql.Date fecha=java.sql.Date.valueOf(textoFecha);

aun que no se si te interesa guardar la hora o solo la fecha por que esto dice la documentacion de java:

Cita:
valueOf

public static Date valueOf(String s)
Converts a string in JDBC date escape format to a Date value.
Parameters:
s - a String object representing a date in in the format "yyyy-mm-dd"
Returns:
a java.sql.Date object representing the given date
Throws:
IllegalArgumentException - if the date given is not in the JDBC date escape format (yyyy-mm-dd)

saludos
__________________
-=:[ Lo importante no es saber todo, sino saber buscar ]:=-
  #3 (permalink)  
Antiguo 15/10/2009, 01:44
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: pasar String a Date

Hola, precisamente me dá al hacer lo que dices el siguientes error;

Error 500--Internal Server Error

java.lang.IllegalArgumentException
at java.sql.Date.valueOf(Date.java:104)
at es.aena.sgma.controlresiduos.service.impl.SalidaRe siduoServiceImpl.obtenerSalidasResiduosSegunSelecc ion(SalidaResiduoServiceImpl.java:307)
at jrockit.reflect.VirtualNativeMethodInvoker.invoke( Ljava.lang.Object;[Ljava.lang.Object;)Ljava.lang.Object;(Unknown Source)
at java.lang.reflect.Method.invoke(Ljava.lang.Object;[Ljava.lang.Object;I)Ljava.lang.Object;(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoi npointUsingReflection(AopUtils.java:301)
at org.springframework.aop.framework.ReflectiveMethod Invocation.invokeJoinpoint(ReflectiveMethodInvocat ion.java:182)
at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :149)
at org.springframework.transaction.interceptor.Transa ctionInterceptor.invoke(TransactionInterceptor.jav a:106)
at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :171)
at org.springframework.aop.framework.JdkDynamicAopPro xy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy162.obtenerSalidasResiduosSegunSeleccion(Lja va.util.ArrayList;)Ljava.util.Collection;(Unknown Source)
at es.aena.sgma.controlresiduos.web.struts.action.Lis tarSalidasResiduosAction.recargarListaConSeleccion (ListarSalidasResiduosAction.java:252)
at jrockit.reflect.VirtualNativeMethodInvoker.invoke( Ljava.lang.Object;[Ljava.lang.Object;)Ljava.lang.Object;(Unknown Source)
at java.lang.reflect.Method.invoke(Ljava.lang.Object;[Ljava.lang.Object;I)Ljava.lang.Object;(Unknown Source)
at com.opensymphony.xwork2.DefaultActionInvocation.in vokeAction(DefaultActionInvocation.java:441)
at com.opensymphony.xwork2.DefaultActionInvocation.in vokeActionOnly(DefaultActionInvocation.java:280)
at com.opensymphony.xwork2.DefaultActionInvocation.in voke(DefaultActionInvocation.java:243)
at com.opensymphony.xwork2.interceptor.DefaultWorkflo wInterceptor.doIntercept(DefaultWorkflowIntercepto r.java:165)
at com.opensymphony.xwork2.interceptor.MethodFilterIn terceptor.intercept(MethodFilterInterceptor.java:8 7)
at com.opensymphony.xwork2.DefaultActionInvocation.in voke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.validation.Annotati onValidationInterceptor.doIntercept(AnnotationVali dationInterceptor.java:50)
at com.opensymphony.xwork2.interceptor.MethodFilterIn terceptor.intercept(MethodFilterInterceptor.java:8 7)
at com.opensymphony.xwork2.DefaultActionInvocation.in voke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ConversionErro rInterceptor.intercept(ConversionErrorInterceptor. java:122)
at com.opensymphony.xwork2.DefaultActionInvocation.in voke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ParametersInte rceptor.doIntercept(ParametersInterceptor.java:195 )

Lo que yo quiero es pasar una fecha que tengo como string de la forma dd/MM/yy HH:mm:ss a formate Date. Esto es así porque de la página jsp recupero la fecha en forma de string, y en el método del action (o del ServiceImpl) necesito hacer una consulta con ese dato a un VO, pero en modo Date, ya que en el VO el campo es de tipo Date, y no me deja hacer la consulta en modo String. A ver si puedes ayudarme, muchas gracias de antemano, un saludo
  #4 (permalink)  
Antiguo 15/10/2009, 02:15
 
Fecha de Ingreso: agosto-2009
Mensajes: 67
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: pasar String a Date

Hola.

¿Has probado a utilizar la clase SimpleDateFormat?

Echa un vistazo al javadoc de esa clase para ver si te sirve. Tiene los métodos parse y format para leer y escribir fechas en formato String...


Un saludo.
  #5 (permalink)  
Antiguo 15/10/2009, 02:36
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: pasar String a Date

Hola, si, lo estoy intentando hacer de esa manera, pero sigo sin poder utilizarlo para buscar un valor. Necesito utilizar ese objeto Date que obtengo a partir del String para buscar en un Entity un valor tipo Date, a ver si en una lista de Entities que tengo existe ese valor o no.
Según veo en el Debug en eclipse, los valores del String y de mi objeto Date creado a partir del String no parecen ser iguales, el string es: 8/21/09 12:00:00 AM.000 mientras que el objeto Date creado es: Wed Aug 21 12:00:00 CET 9 . Y claro, al hacer la consulta no encuentra nada y no recojo ningún objeto Entity que es lo que finalmente quiero. Aquí va parte del código:

private Date fechadate;
...
DateFormat formatoFecha = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
String textofecha = this.getListaseleccionadosftgr().get(0);
try{
this.setFechadate(formatoFecha.parse(textofecha));
}catch (Exception e){
throw new SpringServiceException(e);
}
...

y luego la consulta, donde utilizo Criteria:

Criteria critfecha = session.createCriteria(SalidaResiduo.class)
.add(Restrictions.eq("fechasalida", this.getFechadate()));
listasalidasresiduos = critfecha.list();

donde "fechasalida" es el campo tipo Date en mi Entity SalidaResiduo.java, y this.getFechadate() es el método get de la variable Date fechadate.

¿En qué me estoy equivocando? Muchas gracias, un saludo
  #6 (permalink)  
Antiguo 20/10/2009, 00:57
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: pasar String a Date

Hola, sigo con ello pero no lo consigo. Haciendo debug en eclipse he localizado el fallo o eso creo, pero no consigo resolverlo. El fallo está en las siguientes lineas;

DateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
String textoFecha = this.getFiltroSalidaResiduosForm().getFecha();
Date fecha = formatoFecha.parse(textoFecha);

En la primera linea creo un formato.
En la segunda línea guardo en el string textoFecha una fecha de un select que selecciona un usuario. He probado y por ejemplo un valor guardado sería '8/19/09 12:00:00 AM.000'
En la tercera linea, es cuando se supone que me debería cambiar el string a Date, sin cambios en lo que es al menos el día, el mes y el año que es lo que más me interesa, pero el valor que se guarda en fecha en este caso es 'Tue Jul 08 00:00:00 CET 10'.
¿Tiene alguien una idea de cómo tendría que hacerlo? Muchas gracias, un saludo
  #7 (permalink)  
Antiguo 20/10/2009, 09:02
Avatar de DiabloGuardian  
Fecha de Ingreso: noviembre-2008
Ubicación: Hidalgo
Mensajes: 215
Antigüedad: 15 años, 5 meses
Puntos: 3
Respuesta: pasar String a Date

Cita:
Iniciado por Pelirr Ver Mensaje
En la segunda línea guardo en el string textoFecha una fecha de un select que selecciona un usuario. He probado y por ejemplo un valor guardado sería '8/19/09 12:00:00 AM.000'
la fecha que estas introduciendo no es valida por que no existe el mes 19 por eso te devuelve Tue Jul 08 00:00:00 CET 10. lo que hace es que 19 meses equivalen a un año con 6 meses, guarda los 6 meses y los otros 12 los suma como un año mas

creo que esta bien tu codigo, solo pruebalo con datos reales
__________________
-=:[ Lo importante no es saber todo, sino saber buscar ]:=-
  #8 (permalink)  
Antiguo 23/10/2009, 05:07
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: pasar String a Date

Hola, el problema es que no sé como ni porqué unas veces me coge la fecha como dd/M/yyyy y otras me la coge como MM/dd/yyyy. He probado varias veces, y unas veces textoFecha es '8/19/09 12:00:00 AM.000' y otras veces es '19/08/09 12:00:00 AM.000'. Ese creo que es mi principal problema a la hora de coger la fecha.
Luego tengo otro problema, y es a la hora de hacer una consulta a la bbdd, pidiendo todas las instancias de la clase SalidaResiduo que tengan fecha de ese día, es decir, de 19/08/2009 00:00:00 a 19/08/2009 23:59:59. El método donde hago esta consulta es:

public Collection<SalidaResiduo> obtenerSalidasResiduosDeFecha(Date fecha) throws JpaDaoException {
try {
DateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
DateFormat formatoFechaDestino = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
String textoFecha = formatoFecha.format(fecha);
Date fechaDesde = formatoFechaDestino.parse(textoFecha + " 00:00:00");
Date fechaHasta = formatoFechaDestino.parse(textoFecha + " 23:59:59");
String textoConsulta = "from SalidaResiduo srE where srE.fechasalida >= "+fechaDesde+
" and srE.fechasalida <= "+fechaHasta;
Query consulta = this.getEntityManager().createQuery(textoConsulta) ;

return consulta.getResultList();
} catch (Exception e) {
throw new JpaDaoException(e);
}
}

Pero me dá el siguiente error:

es.aena.sgcomun.base.service.exception.SpringServi ceException: es.aena.sgcomun.base.data.exception.JpaDaoExceptio n: java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: Jul near line 1, column 94 [from es.aena.sgma.controlresiduos.data.entity.SalidaRes iduo srE where srE.fechasalida >= Tue Jul 08 00:00:00 CET 10 and srE.fechasalida <= Tue Jul 08 23:59:59 CET 10]

Es decir, que no sé porqué unas veces me coge la fecha como string dd/MM... y otras como MM/dd..., ni qué está mal en el texto de la consulta para obtener todas las instancias de ese día. ¿Podéis echarme un cable? Muchas gracias, y un saludo
  #9 (permalink)  
Antiguo 23/10/2009, 13:24
Avatar de DiabloGuardian  
Fecha de Ingreso: noviembre-2008
Ubicación: Hidalgo
Mensajes: 215
Antigüedad: 15 años, 5 meses
Puntos: 3
Respuesta: pasar String a Date

para lo de tu consulta poedes hacer esto :

Código:
String textoConsulta = "from SalidaResiduo srE where srE.fechasalida between "+fechaDesde+" and "+fechaHasta;
Query consulta = this.getEntityManager().createQuery(textoConsulta) ;
de donde obtienes las fechas??
las lees de la bd o las ingresa el usuario??
__________________
-=:[ Lo importante no es saber todo, sino saber buscar ]:=-
  #10 (permalink)  
Antiguo 26/10/2009, 02:54
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: pasar String a Date

Hola, he hecho el cambio en la consulta que indicas, pero sigo obteniendo el mismo error (o casi);

es.aena.sgcomun.base.service.exception.SpringServi ceException: es.aena.sgcomun.base.data.exception.JpaDaoExceptio n: java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: Jul near line 1, column 99 [from es.aena.sgma.controlresiduos.data.entity.SalidaRes iduo srE where srE.fechasalida between Tue Jul 08 00:00:00 CET 10 and Tue Jul 08 23:59:59 CET 10]

¿Puede ser que en la consulta no reconozca el formato de la fecha, porque en la bbdd esté de otra manera? El contenido de ese campo en la bbdd de oracle está como tipo Date. Aparte de ésto, en éste caso me ha vuelto a coger la fecha como MM/dd/yyyy, porque la que había seleccionado del select en la jsp es 19/08/2009, y si te fijas la ha cambiado por 08/07/2010. En cuanto a de dónde cojo las fechas, es de la bbdd, el usuario lo que hace es, de un select de la página jsp donde muestro todas las fechas de la bbdd, elegir una, darle a un botón, y con eso se deberían seleccionar todas las instancias de SalidaResiduo con esa fecha.
Si es problema del formato, ¿cómo puedo hacer para que sea el mismo que el de la bbdd? Ya he utilizado la sentencia

DateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");

creí que así al hacer "Date fecha1 = formatoFecha.parse(textoFecha); " hacía que fecha1 tuviera ese formato. A ver si puedes ayudarme, y muchas gracias, un saludo
  #11 (permalink)  
Antiguo 26/10/2009, 03:04
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: pasar String a Date

Wenas

La BBDD tendra un formato de fechas y tu lo estas calculando en otro.

Para que siempre te coja el mismo formato, puedes hacerlo facilmente haciendo esto

Código:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY'
Durante la sesion en BBDD tendra el formato de fecha que le digas. Esto es eficiente cuando estas tratando con distintas BBDD. Por ejemplo la BBDD de desarrollo que este con formato dd/mm/yyyy. pruebas tus cosas, funciona todo perfecto, pero lo llevas a produccion y casca por todos lados. Simplemente porque el formato de fechas es americano.

Saludos.
  #12 (permalink)  
Antiguo 26/10/2009, 05:13
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: pasar String a Date

Hola, pero ¿dónde he de poner esta sentencia? ¿dentro del texto de la consulta, en el script de la bbdd para esa tabla, ...? No he utilizado oracle hasta ahora y estoy bastante pez, te agradecería que me lo explicaras con un poco más de detalle. Muchas gracias, un saludo
  #13 (permalink)  
Antiguo 26/10/2009, 06:07
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: pasar String a Date

Para que te hagas a la idea, te lo pongo estilo jdbc. Ahora tu trasladalo a hibernate o a lo que quieras.

Código:
public void obtenerFechas (Connection con) throws SQLException
{
       String consulta = "select id,fecha1 from usuarios where login='pepito'";
       PreparedStatement ps = null;
          ps  = con.prepareStatement("ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY'"); 
          ps.execute();
          ps  = con.prepareStatement(consulta); 
          ps.execute();
}
Tu tienes una conexion (una sesion de BD). Y tu estas en España, por lo que tu quieres que las fechas te laas devuelva en formato 'cristiano', usease, DD/MM/YYYY
Ahora imaginate que tienes una base de datos oracle, que si no ha sido cambiada por el administrador de BBDD, coje por defecto las fechas en formato americano (MM/DD/YYYY). Los 'jodidos' angicanos, que tienen que hacerlo todo distinto.

Por todo ello tienes dos opciones, o coges las fechas en formato americano, es decir, tu programacion se basa en la BBDD o cambias la BBDD para que se base en tu programa (todo esto a muy grandes rasgos).

La primera opcion, es peligrsisima, por el ejemplo que te puse antes. (BBDD de pruebas en formato español y BBDD de produccion en formato americano, por ejemplo), por lo que la unica viable, seria la segunda opcion. Asi no te tendrias que preocupar del idioma de la BBDD.

Esta segunda opcion seria el alter session. con ello consigues, que mientras tu conexion este viva, la tengas tu. Puedes 'amoldarla' para evitarte estos inconvenientes.

En el ejemplo que te he puesto, primero le dices a la BBDD que quieres las fechas en formato dd/mm/yyyy. Y que te importa un pimiento como esten en ella.
En la segunda al ejecutar tu consulta te devolvera las fechas en en formato que tu le dices.

Estos cambios SOLO tienen efecto en tu sesion. Por lo que el resto de las conexiones NO se ven afectadas.

Saludos.

PD. Si por ejemplo pides la fecha en formato largo, te devolveria, por ejemplo, October, 26 2009 Monday. Si lo quieres en castellano, seria.

alter session set nls_date_language='SPANISH'

Y los Monday y October, pasarian por arte de magia al lenguaje patrio.
  #14 (permalink)  
Antiguo 27/10/2009, 09:58
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: pasar String a Date

Hola, algo debo hacer mal al hacer la primera consulta porque me dá el siguiente error :

java.lang.IllegalArgumentException: node to traverse cannot be null!

cuando llega a la linea:

this.getEntityManager().createQuery(consultaformat ofecha);

del método:

@SuppressWarnings("unchecked")
public Collection<SalidaResiduo> obtenerSalidasResiduosDeFecha(Date fecha) throws JpaDaoException {
try {
DateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
DateFormat formatoFechaDestino = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
String textoFecha = formatoFecha.format(fecha);
Date fechaDesde = formatoFechaDestino.parse(textoFecha + " 00:00:00");
Date fechaHasta = formatoFechaDestino.parse(textoFecha + " 23:59:59");
String textoConsulta = "from SalidaResiduo srE where srE.fechasalida between "+fechaDesde+" and "+fechaHasta;
//Para que el formato de fecha se mantenga durante la sesión primero se hace esta consulta
String consultaformatofecha = "ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY'";
this.getEntityManager().createQuery(consultaformat ofecha);

Query consulta = this.getEntityManager().createQuery(textoConsulta) ;

return consulta.getResultList();
} catch (Exception e) {
throw new JpaDaoException(e);
}
}

si no he entendido mal, primero tengo que decirle como quiero las fechas durante mi sesion con "ALTER ....", y después hacer la consulta que yo quiera (en este caso, "from SalidaResiduo...". ¿Tendría utilizar el ALTER ... de otro modo? Muchas gracias, un saludo
  #15 (permalink)  
Antiguo 27/10/2009, 11:13
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: pasar String a Date

Creo que no lo has entendido.

El alter session ANTES de ejecutar tu query. Si. No tiene sentido hacerlo despues.

Pero la ventaja del alter session seria que ya no tendrias que hacer nada con Simpledateformat ni nada por el estilo. Tu consulta es una simple query y las fechas serian 2 strings.

Asi, si no quieres usar el alter session siempre puedes ponerle el formato a tu query.
Código:
select * from pepe where to_char(fecha,'dd/mm/yyyy') between '01/01/2008' and '31/12/2008'
Tambien es valido.

Saludos.
  #16 (permalink)  
Antiguo 12/11/2009, 10:14
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: pasar String a Date

Vale, ya lo entiendo. Muchas gracias por todo,

un saludo
  #17 (permalink)  
Antiguo 12/11/2009, 11:43
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: pasar String a Date

// Ejemplo: Obtener fecha actual en formato String

import java.util.Date;
import java.text.SimpleDateFormat;

Date fecha = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
//obtenemos la fecha actual formateada como deseamos
String fechaActual = sdf.format(fecha);


// Ejemplo 2: Obtener Date a partir de una fecha en string con el formato anterior

import java.util.Date;
import java.text.SimpleDateFormat;

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

String fecha = "10/11/2009";

/**
* Devuelve la fecha en formato Date
* @return dt Fecha en formato Date
*/
public Date getDtFecha(String fecha) {
Date dt = null;
if ((this.fecha != null) && (!"".equals(this.fecha)))
try {
dt = sdf.parse(this.fecha);
} catch (ParseException ex) {
dt = null;
}
return dt;
}

Date fechaDt = getDtFecha(fecha);
  #18 (permalink)  
Antiguo 16/11/2009, 01:27
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: pasar String a Date

Muchas gracias, un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:11.