Transformando String a Date – uso de SimpleDateFormat


En uno de los post, se planteo la pregunta ¿cómo puedo transformar un String a Date? Para hacer más interesante el asunto el valor de la variable String estaba en el siguiente formato año-mes-día. En código se vería algo así:

String strFecha «2007-12-25»;

Con anterioridad conocía la existencia de la clase SimpleDateFormat, que hasta ahora la utilicé para «formatear» la salida de un objeto tipo Date. Cuando se imprime en consola un objeto Date se obtiene: Wed Nov 21 12:27:55 COT 2007, pero mi salida debe ser algo así: 21/11/2007. En código sería así:

Calendar calendario = GregorianCalendar.getInstance();
Date fecha = calendario.getTime();
System.out.println(fecha);
SimpleDateFormat formatoDeFecha = new SimpleDateFormat(«dd/MM/yyyy»);
System.out.println(formatoDeFecha.format(fecha));

El primer System.out.println imprime Wed Nov 21 12:27:55 COT 2007, mientras que el segundo imprime la fecha de acuerdo al formato día/mes/año (21/11/2007) que se especifica como parámetro del constructor de la clase SimpleDateFormat.

Pero la clase SimpleDateFormat no solamente me permite «formatear» objetos tipo Date, sino que me permite crear objetos Date a partir de un String que se encuentra en un formato determinado. Es así cómo se puede hacer.

  1. Creamos un objeto SimpleDateFormat y el parámetro del constructor será el formato en el que se encuentra la variable tipo String.
  2. Crear un objeto tipo date, en donde se almacenará la fecha.
  3. Utilizar el método parse de la clase SimpleDateFormat, tener en cuenta que puede lanzar excepciones.

En código:

SimpleDateFormat formatoDelTexto = new SimpleDateFormat(«yyyy-MM-dd»);
String strFecha = «2007-12-25»;
Date fecha = null;
try {

fecha = formatoDelTexto.parse(strFecha);

} catch (ParseException ex) {

ex.printStackTrace();

}

System.out.println(fecha.toString());

Una nota sobre los formatos: si utilizamos una m minúscula estamos diciendo minutos, si utilizamos M mayúscula decimos meses. Aquí pueden encontrar mayores detalles

Powered by ScribeFire.

41 comentarios en “Transformando String a Date – uso de SimpleDateFormat

  1. si esta muy bien la explicacion , solo q te falto un detalle si tu tienes un formato de fecha dd/MM/YYYY y u string q representa cierta fecha «16/29/2007» este elemento no genera error, lo q hace es correr el año segun el numero de meses ingresado en el campo . ojo con ese pequeño detalle.

    1. Usma. Ese «detalle» se puede cambiar con el método setLenient(boolean arg). Al ponerlo en false fuerza a que la fecha sea válida, en caso contrario tiraría un ParserException. Por default esta en true, permitiendo al parser a tratar de corregir la fecha.

      Por cierto que para JavaME DateFormat solo sirve para dar formato a fechas y no para parsear «strings»

  2. y si quiero obtener la fecha directamente de un JTextField? esque necesito guardar un campo date en una base de datos, pero no se como :S

  3. Hola, quisiera saber como haria para parsear una fecha con un formato de este tipo «Mon Jun 29 00:04:23 GMT-03:00 2009»
    desde ya muchas gracias.

  4. «Hola Mundo»

    Alguien sabe con usar el «SimpleDateFormat» en J2ME necesito realizar las mismas operaciones de conversión de fecha, pero en J2ME no me permite usar esteta clase. Alguna sugerencia?

  5. Esto me a ayudado mucho gracias pero ahora solo tenia una duda mas esa fecha q converti a DATE q era String como peudo sumarle un dia si alguien em avisa como es muchas: Gracias

    1. Hola Shadow Warrior,

      Te comento que algo me ha ayudado para hacer las sumas es trabajar con las fechas pero expresadas en milisegundos, con un número tipo long, si quiero sumarle 1 día a ese día también lo transforma a milisengundos, suma esos datos y vuelvo a transformarlo en Date y ahí obtengo el resultado. También e visto que el la Clase Calendar tiene un método add, pero no le he usado.

      Saludos

  6. Tengo un problema para convertir un string a un date de formato (yyyy-MM-dd HH:mm:ss.SSS).

    Me bota error y mi variable date sigue en valor null

  7. Hola muchas gracias por el post, quisiera saber como hago para validar si una fecha es mayor que otra por ejemplo if (fecha < fecha1) { etc….

  8. Hola,
    Tengo dos problemas y al exponerlos, me seria de mucha ayuda su pronta respuesta,
    1.el compilador me dice que hay una ambiguedad, con el Date de la clase sql y con el Date de la clase Util
    reference to Date is ambiguous, both class java.sql.Date in java.sql and class java.util.Date in java.util match
    2.No puedo usar el SimpleDateFormat, creo que es por no importar una libreria, pero no estoy seguro
    gracias

  9. hola amigo soy algo nuevo en esto de programacion estoy haciendo un aplicacion de escritorio donde muestra hora y feche asta ahora solo he logrado que me muestre la hora bueno lo que quiero es que me muestre la fecha en un formato asi: 18/08/2011 pero me gustaria que la fecha se mueste en un Jlabel

    gracias saludos

    1. Hola Ezau, bueno la verdad es q ahora existe un componente el swing llamado FormattedTextField que extiende de JTextField , con este componente podrás darle formato tanto a fechas como a números ya trae algunos formatos genéricos pero también puedes darles tus propios formatos.

  10. Me ayudó, ya que mi código no guarda el año completo, solo las dos últimas cifras.
    Calendar date = Calendar.getInstance();
    date.set(Integer.parseInt(fecha.substring(5, 8)),
    (Integer.parseInt(fecha.substring(3, 4)) – 1),
    Integer.parseInt(fecha.substring(1, 2)));

  11. Muy bueno, en mi caso lo que necesito es ingresar una fecha por teclado tipo 2014-05-31, pero esto tiene que ser tomado para meterlo como parametro de entrada de un call a un stored procedure en donde el parametro es int fecha Date, entonces en el call storedP (?);
    Como hago para que tome mi fecha correctamente?

    Muchas Gracias.

  12. Hola, una pregunta : Tengo una propiedad fechaVersion() de tipo Calendar y me piden implementar una propiedad derivada de ésta llamada StrFechaVersion de tipo String. El valor de esta propiedad será una representación de la fecha contenida en la propiedad fechaVersion con el formato numérico «día/mes/año».
    ¿por favor alguien que lo sepa? no paro de darle vueltas y sigue fallándome el código.
    Muchas gracias 🙂

    1. En la instancia de tu objeto SimpleDateFormat le mandas como parámetro el String tal como quieres que se muestre formato = new SimpleDateFormat(«dd-MM-yyyy»)
      El metodo form de SDF recibe un objeto Date y te devuelve un String
      Espero te sirva

  13. Hola, nose si me pueden ayudar, pero tengo una variable tipo String que es fecha, que recupero desde un html que tiene como valor ‘2014-12-06’ y quiero convertir a una variable de tipo Date, porque en mi base de datos mi atributo fecha esta en tipo Date,pero no me funciona y no se que hacer, si alguien puede ayudarme porfavor.

    1. Seguramente el date en tu BD es de tipo sql
      Primero revisa que la clase que estes importando en tu DAO sea sql.Date
      cuando vayas a escribir la fecha haz un casting
      Suponiendo que tienes un PreparedStatement para hacer la escritura
      ps.setDate ((Date)bean.getFecha ());
      Espero que te pueda ayudar

    1. SimpleDateFormat tiene un método para parsear una cadena en Date

      SimpleDateFormat format = new SimpleDateFormat();
      Date fecha = format.parse(«aquí tu fecha en String o la variable donde guardas el String»);

      El método tira una excepción así que debes atraparla con un try catch o hacer tu método throwable

      Saludos!!!

Deja un comentario