Diferencia entre revisiones de «SimpleDateFormat»

De ChuWiki
Saltar a: navegación, buscar
(Obtener un ''Date'' a partir de un ''String'')
m (Locale)
 
(No se muestran 3 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
 
 
== Para qué sirve ''SimpleDateFormat'' ==
 
== Para qué sirve ''SimpleDateFormat'' ==
  
Línea 45: Línea 44:
  
 
Una cosa interesante es que a la hora de convertir un ''String'' a ''Date'', la clase ''SimpleDateFormat'' es "indulgente", es decir, si metemos mal el ''String'', trata de corregirlo. Por ejemplo, si introducimos una fecha "32 de Enero", no obtendremos error, sino que se arreglará y nos devolverá un Date correspondiente a "1 de Febrero". Podemos eliminar este comportamiento con el método ''setLenient(false)'';
 
Una cosa interesante es que a la hora de convertir un ''String'' a ''Date'', la clase ''SimpleDateFormat'' es "indulgente", es decir, si metemos mal el ''String'', trata de corregirlo. Por ejemplo, si introducimos una fecha "32 de Enero", no obtendremos error, sino que se arreglará y nos devolverá un Date correspondiente a "1 de Febrero". Podemos eliminar este comportamiento con el método ''setLenient(false)'';
 +
 +
SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
 +
formateador.setLenient(false);
 +
 +
de esta forma, el "32 de Enero" dará un error.
 +
 
Otro aspecto importante a tener en cuenta es nunca enviar
 
Otro aspecto importante a tener en cuenta es nunca enviar
 
  SimpleDateFormat formateador = new SimpleDateFormat("dd/mm/yyyy");
 
  SimpleDateFormat formateador = new SimpleDateFormat("dd/mm/yyyy");
Línea 51: Línea 56:
 
debido a que mm se refiere a minutos y no meses.
 
debido a que mm se refiere a minutos y no meses.
  
SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
+
== Locale ==
formateador.setLenient(false);
+
  
de esta forma, el "32 de Enero" dará un error.
+
SimpleDateFormat trabaja por defecto en el idioma del sistema operativo. Por ejemplo, si nuestro sistema operativo es español y ejecutamos el siguiente código
 +
 
 +
<pre class="sh_java">
 +
SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE MMMM d HH:mm:ss z yyyy");
 +
System.out.println(dateFormat.format(new Date()));
 +
</pre>
 +
 
 +
obtendremos la siguiente salida
 +
 
 +
martes junio 18 07:39:34 CEST 2013
 +
 
 +
es decir, EEEE corresponde al día de la semana y lo obtenemos en español, mientras que MMMM corresponde al mes y lo obtenemos también en español (M da el mes con una cifra, por ejemplo, 6. MM lo da con dos, es decir, 06. MMM da tres letras del mes, es decir jun. MMMM da todas las letras del mes necesarias. De igual forma sucede con E, EE, EEE y EEEE para el día de la semana).
 +
 
 +
De igual forma, el método parse() de SimpleDateFormat espera en ese idioma por defecto (español en este caso) el día de la semana, mes, etc en el caso de que estén con texto y no con cifras. El siguiente código funcionará correctamente
 +
 
 +
dateFormat.parse("martes junio 18 07:39:34 CEST 2013");
 +
 
 +
con dateFormat definido como en el trozo de código anterior.
 +
 
 +
Podemos cambiar este idioma por defecto en el momento de construir el SimpleDateFormat, pasando un segundo parámetro con el Locale desdeado. Por ejemplo, si con el sistema operativo en español usamos el Locale.UK
 +
 
 +
<pre class="sh_java">
 +
SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE MMMM d HH:mm:ss z yyyy", Locale.UK);
 +
String fecha = dateFormat.format(new Date());
 +
</pre>
 +
 
 +
el código de salida será
 +
 
 +
Tuesday June 18 07:45:18 CEST 2013
 +
 
 +
y nuestro ejemplo de parse anterior
 +
 
 +
dateFormat.parse("martes junio 18 07:39:34 CEST 2013");
 +
 
 +
fallará por tener los textos en español (martes y junio).
 +
 
 +
Aparte de los Locale definidos directamente el Locale, como Locale.UK, Locale.US, Locale.GERMAN, ... podemos construir nuestro propio Locale pasando dos parámetros al constructor de Locale, uno de idioma y otro de país, por ejemplo
 +
 
 +
Locale espanol = new Locale("es","ES");
 +
 
 +
El método Locale.getAvailableLocales() nos permite saber que combinaciones de idioma/país son válidas. El siguiente código las muestra todas
 +
 
 +
<pre class="sh_java">
 +
Locale[] locales = Locale.getAvailableLocales();
 +
for (Locale local:locales){
 +
  System.out.println(local.getLanguage() + ", "+local.getCountry());
 +
}
 +
</pre>
  
 
== Enlaces externos ==
 
== Enlaces externos ==
  
 
*Un ejemplo en el foro del Jefe: [http://foro.chuidiang.com/index.php?topic=613.msg2076#msg2076 Ejemplo de SimpleDateFormat]
 
*Un ejemplo en el foro del Jefe: [http://foro.chuidiang.com/index.php?topic=613.msg2076#msg2076 Ejemplo de SimpleDateFormat]
 +
*La documentación de la API : [http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html SimpleDateFormat]
  
 
[[Categoría:Java:Básico]]
 
[[Categoría:Java:Básico]]

Revisión actual del 07:51 18 jun 2013

Para qué sirve SimpleDateFormat

La clase SimpleDateFormat nos ayuda a mostrar las fechas en el formato que queramos o a reconstruirlas a partir de una cadena de texto.


Convertir un Date a String

Un uso simple de SimpleDateFormat para escribir una fecha en pantalla puede ser este

import java.text.SimpleDateFormat;
...
SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");

// Esto muestra la fecha actual en pantalla, más o menos así 26/10/2006
System.out.println(formateador.format(new Date()));

Por supuesto, podemos jugar con la máscara y ponerla a nuestro gusto, dentro de las posibilidades que nos ofrece la API de SimpleDateFormat.

SimpleDateFormat formateador = new SimpleDateFormat("'Hoy es' EEEEEEEEE dd 'de' MMMMM 'de' yyyy");
SimpleDateFormat formatea = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat forma    = new SimpleDateFormat("'Ingresaste' EEEEEEEEE dd 'de' MMMMM 'de' yyyy");
DateFormat formatoFecha=DateFormat.getDateInstance(DateFormat.FULL);

En la API de SimpleDateFormat podemos ver todas las opciones para la máscara de fecha y hora.


Obtener un Date a partir de un String

Para reconstruir una fecha a partir de la cadena de texto, podemos usar la misma clase SimpleDateFormat. Por ejemplo, si un usuario escribe una fecha con este formato en un JTextField, podemos leerla así

import java.text.SimpleDateFormat;
...
JTextField textField = new JTextField();
...
SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
try
{
   Date fecha = formateador.parse(textField.getText());
}
catch (ParseException e)
{
   // Error, la cadena de texto no se puede convertir en fecha.
}

Una cosa interesante es que a la hora de convertir un String a Date, la clase SimpleDateFormat es "indulgente", es decir, si metemos mal el String, trata de corregirlo. Por ejemplo, si introducimos una fecha "32 de Enero", no obtendremos error, sino que se arreglará y nos devolverá un Date correspondiente a "1 de Febrero". Podemos eliminar este comportamiento con el método setLenient(false);

SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
formateador.setLenient(false);

de esta forma, el "32 de Enero" dará un error.

Otro aspecto importante a tener en cuenta es nunca enviar

SimpleDateFormat formateador = new SimpleDateFormat("dd/mm/yyyy");

en vez de

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

debido a que mm se refiere a minutos y no meses.

Locale

SimpleDateFormat trabaja por defecto en el idioma del sistema operativo. Por ejemplo, si nuestro sistema operativo es español y ejecutamos el siguiente código

SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE MMMM d HH:mm:ss z yyyy");
System.out.println(dateFormat.format(new Date()));

obtendremos la siguiente salida

martes junio 18 07:39:34 CEST 2013

es decir, EEEE corresponde al día de la semana y lo obtenemos en español, mientras que MMMM corresponde al mes y lo obtenemos también en español (M da el mes con una cifra, por ejemplo, 6. MM lo da con dos, es decir, 06. MMM da tres letras del mes, es decir jun. MMMM da todas las letras del mes necesarias. De igual forma sucede con E, EE, EEE y EEEE para el día de la semana).

De igual forma, el método parse() de SimpleDateFormat espera en ese idioma por defecto (español en este caso) el día de la semana, mes, etc en el caso de que estén con texto y no con cifras. El siguiente código funcionará correctamente

dateFormat.parse("martes junio 18 07:39:34 CEST 2013");

con dateFormat definido como en el trozo de código anterior.

Podemos cambiar este idioma por defecto en el momento de construir el SimpleDateFormat, pasando un segundo parámetro con el Locale desdeado. Por ejemplo, si con el sistema operativo en español usamos el Locale.UK

SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE MMMM d HH:mm:ss z yyyy", Locale.UK);
String fecha = dateFormat.format(new Date());

el código de salida será

Tuesday June 18 07:45:18 CEST 2013

y nuestro ejemplo de parse anterior

dateFormat.parse("martes junio 18 07:39:34 CEST 2013");

fallará por tener los textos en español (martes y junio).

Aparte de los Locale definidos directamente el Locale, como Locale.UK, Locale.US, Locale.GERMAN, ... podemos construir nuestro propio Locale pasando dos parámetros al constructor de Locale, uno de idioma y otro de país, por ejemplo

Locale espanol = new Locale("es","ES");

El método Locale.getAvailableLocales() nos permite saber que combinaciones de idioma/país son válidas. El siguiente código las muestra todas

Locale[] locales = Locale.getAvailableLocales();
for (Locale local:locales){
   System.out.println(local.getLanguage() + ", "+local.getCountry());
}

Enlaces externos