jueves, 28 de mayo de 2009

Fecha Actual en Español con Java











Podemos obtener la fecha actual en java mediante tres sencillos pasos:


Paso 1. Crear un formateador que será un objeto SimpleDateFormat. Como parámetros le pasaremos el formato de la fecha y el idioma (objeto Locale):


   SimpleDateFormat formateador = new SimpleDateFormat("dd 'de' MMMM 'de' yyyy", new Locale("es_ES"));

A continuación se indica cómo formatear los días, meses y años:


Año


"yy" -> "03″

"yyyy" -> "2003″


Mes


"M" -> "7″

"M" -> "12″

"MM" -> "07″

"MMM" -> "Jul"

"MMMM" -> "Deciembre"


Día del mes


"d" -> "3″

"dd" -> "03″


Paso 2. Crear un objeto Date:


   Date fechaDate = new Date();


Paso 3. Formatear la fecha usando el formateador y pasándole como argumento el objeto Date:


   String fecha=formateador.format(fechaDate);

El ejemplo completo quedaría así:


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

   public class Principal {
   public static void main(String[] args) {
   SimpleDateFormat formateador = new SimpleDateFormat(
   "dd 'de' MMMM 'de' yyyy", new Locale("es_ES"));
   Date fechaDate = new Date();
   String fecha = formateador.format(fechaDate);
   System.out.println(fecha);
   }
   } 




Resultado


Lo que obtendremos será de este tipo:


12 de Junio de 2009




61 Comentarios:

El blog de mou dijo...

OK. ESTUPENDO, PERO COMO AGREGAR ESTO EN UN ARCHIVO QUE SEA COMO UNA CLAS DE VITACORA EN DONDE TIENES QUE GUARDAR DATOS CON FECHA Y HORA DE MOVIMIENTO.

GRACIAS MILES

MIK

Felipe Martínez D. dijo...

Hola Domdoz.
Puedes hacerlo en forma de método e incorporarlo a una clase. Al llamarlo, te devolvería un String con la fecha en español. Sería así:


private String fecha(){
SimpleDateFormat formateador = new SimpleDateFormat(
"dd 'de' MMMM 'de' yyyy", new Locale("es_ES"));
Date fechaDate = new Date();
String fecha = formateador.format(fechaDate);
return(fecha);
}


Espero haber respondido a tu pregunta.
Gracias por comentar.

enrique dijo...

Hola, a mi me sale en ingles el mes, 12 de March de 2012 gracias buen trabajo!

Felipe Martínez D. dijo...

Gracias Enrique por comentar.

Debería salirte en español. El idioma se especifica aquí:

new Locale("es_ES")

Osea, le estamos indicando que la ponga en español de España.

Asegúrate que tienes todos los "import" y que tienes la última versión del JDK (aunque no creo que sea ese el problema).

Saludos!

epineda dijo...

Hola Enrique esto esta interesante, necesito tu ayuda...estoy empezando con un curso de diseño web y estoy en la parte de Javascript, pero tengo problemas para realizar un ejercicio, a lo mejor para ti sea sencillo pero será posible que me puedas ayudar enviando un correo explicativo como hacerlo en js? es sobre el cálculo de la edad de una persona ingresando su fecha de nacimiento...
Mi email es bustillos.elio@terra.com

Felipe Martínez D. dijo...

Hola epineda.

Te he contestado en tu correo.

Saludos.

Armando dijo...

Muy buen post, sin darle rodeos al problema y explicado de manera muy sencilla.

Saludos

Felipe Martínez D. dijo...

Gracias Armando. Me alegra que te haya servido.

Anónimo dijo...

Si con es_ES sale el nombre del mes en inglés, puedes cambiarlo por ES. La primera línea quedaría así:

SimpleDateFormat formateador = new SimpleDateFormat("dd 'de' MMMM 'de' yyyy", new Locale("ES"));

Me pasaba lo mismo que a Enrique, y con este cambio ya sale el nombre del mes en español.

Anónimo dijo...

Muy interesante la información me ayudo mucho.

Muchas gracias

Felipe Martínez D. dijo...

Gracias a tí por comentar.

Anónimo dijo...

como cambiar el formato de la fecha en un programa java com este por ejemplo:
import java.util.*;
public class HolaFecha {
public static void main(String[] args) {
Date fecha = new Date();
System.out.println ("Hola, hoy es: " ) ;
System.out.println (fecha) ;
public Date getValue();
}
}

Felipe Martínez D. dijo...

Buenas.

¿Qué formato quieres darle a la fecha?

Si quieres que sea como el del ejemplo superior, sólo tienes que hacer ésto:


SimpleDateFormat formateador = new SimpleDateFormat(
"dd 'de' MMMM 'de' yyyy", new Locale("es_ES"));
Date fechaDate = new Date();
String fecha = formateador.format(fechaDate);
System.out.println("Hola, hoy es: " + fecha);

Saludos.

Anónimo dijo...

muy buen trabajo, me gustaria saber como mostrar la fecha con el nomre del dia, es decir, algo asi:

lunes, 27 de septiembre de 2010

gracias

Felipe Martínez D. dijo...

Buenas

Simplemente cambia la línea:

SimpleDateFormat formateador = new SimpleDateFormat("dd 'de' MMMM 'de' yyyy", new Locale("es_ES"));

por esta línea:

SimpleDateFormat formateador = new SimpleDateFormat("EEEE ',' dd 'de' MMMM 'de' yyyy", new Locale("ES"));


Lo que he hecho es añadir el parámetro EEEE que te muestra el día de la semana.

Espero que te sirva.

Saludos.

Anónimo dijo...

hola me podrias ayudar quiero escribir dentro de un campo de texto la fecha en letras y luego convertirla a formato dd/mm/yyyy (ejem cinco de enero de dos mil diez) o septiembre cinco de dos mil diez(09/095/2010) dependiendo como lo escriba el usuario..

Anónimo dijo...

hola me podrias ayudar quiero escribir dentro de un campo de texto la fecha en letras y luego convertirla a formato dd/mm/yyyy (ejem cinco de enero de dos mil diez a 05/01/2010) o septiembre cinco de dos mil diez(09/05/2010) dependiendo como lo escriba el usuario..

Felipe Martínez D. dijo...

Buenas.

Te sugiero que hagas un desplegable para los días, otro para los meses y otro para los años. De esa forma te vas a evitar que el usuario escriba cualquier cosa que no sean fechas en el campo de texto.

A parte, para convertir los números escritos con palabras a números quizás necesites alguna librería, que yo desconozco.

Dime si te parece bien mi solución. Si tienes alguna duda o problema, pregúntame.

Saludos.

Anónimo dijo...

gracias felipe por tu solucion, me funcionó correctamente, ya me muestra la fecha con el nombre del dia.

Felipe Martínez D. dijo...

Ok, me alegro de que solucionaras tu problema.

Saludos.

Darío dijo...

Mmm... y qué tal esta solución:

<code>
Date now = new Date();
String fecha = DateFormat.getDateInstance(DateFormat.FULL).format(now);
</code>

De esa manera devuelve la fecha en el idioma predeterminado (si la compu está en spanish entonces así será).

Felipe Martínez D. dijo...

Hola Darío.

Tu solución es correcta y muy similar a la que doy en este post.

De todas formas, me parece interesante exponer el uso de SimpleDateFormat, como forma sencilla de formatear fechas, según nuestras necesidades.

También hay que apuntar que si el código se ejecuta en una JSP desde un servidor, en el ordenador del cliente se verá en el idioma que tenga como predeterminado el ordenador servidor. Eso también habría que tenerlo en cuenta.

Muchas gracias por tu apunte.

Saludos.

Julio García G. dijo...

Una forma también útil para pedir datos de fechas sería usar una librería externa como SwingX, que tiene un elemento llamado JXDatePicker que simplifica mucho elegir fechas. Es una opción más usable y amigable para el usuario que múltiples comboboxes. =

Felipe Martínez D. dijo...

Hola Julio.

Gracias por tu aportación. No conocía esa librería, puede facilitar mucho las cosas a la hora de hacer la interfaz gráfica y tener que trabajar con fechas. Le echaré un vistazo.

Saludos.

uJuan dijo...

Excelente man, me sirvió mucho

Felipe Martínez D. dijo...

Hola Juan.

Me alegro de que te sirviera.

Saludos.

Anónimo dijo...

Excelente ,
ami me gustaria que el nombre del mes saliera en Mayuscula la primera

Felipe Martínez D. dijo...

Hola.

Pues ahí ya tendrías que tratar el mes de forma independiente del resto de la fecha. Si tenemos el nombre del mes, tomamos un substring de éste que sería la primera letra y lo pasamos a mayúsculas:

SimpleDateFormat formateador = new SimpleDateFormat(
"MMMM", new Locale("es"));
Date fechaDate = new Date();
String fecha = formateador.format(fechaDate);

fecha = fecha.substring(0, 1).toUpperCase() + fecha.substring(1, fecha.length());
System.out.println(fecha);


Saludos.

Esteban dijo...

Muchas gracias por la informacion , me fue de mucha ayuda, en mi caso era nesesario que el mes apareciera escrito en rumano indiferentemente de la configuracion regional del sistema.

SimpleDateFormat formateador = new SimpleDateFormat("dd MMMMM yyyy", new Locale("RO"));

Felipe Martínez D. dijo...

Hola Esteban.

Me alegro de que te sirviera. Efectivamente, utilizando el objeto Locale, pasar cualquier fecha a otro idioma es inmediato.

Saludos.

Anónimo dijo...

Hola gente, buen foro m gusto muxo.
aq les dejo tra forma de ver la fecha.
SimpleDateFormat sdf = new SimpleDateFormat("EEEE dd 'de' MMMM 'del' yyyy", Locale.getDefault());
Date fechaDate = new Date();
String fecha = sdf.format(fechaDate);
System.out.print(fecha);
SALIDA : martes 07 de mayo del 2011

solo seria el cambio en Locale.getDefault(), con esto sale el idioma q sta configurado tu sistema operativo

Felipe Martínez D. dijo...

Muchas gracias por la aportación. También hay que apuntar que mediante Locale.getDefault(), el valor de Locale será el que hay por defecto en la instancia de la Máquina Virtual de Java. Es decir, que si por ejemplo estamos en Linux, la fecha puede salirnos en inglés, cuando nosotros deseamos que aparezca en español.

De todas formas, la variable Locale por defecto se puede cambiar fácilmente así:

Locale.setDefault(myLocale);


Saludos.

Anónimo dijo...

Gracias
aun funciona de maravillla !!!!!!!
:DDDDD

Felipe Martínez D. dijo...

Ok, gracias a tí por comentar.

Saludos.

Anónimo dijo...

Muchas gracias con tu explicacion me adelante la clase...

Anónimo dijo...

hola necesito de tu ayuda y quisiera saber como calcular la edad de una persona con la edad de nacimiento y la edad q tiene el sistema

Felipe Martínez D. dijo...

Hola.

Gracias a ambos por comentar.

Si quieres calcular la edad de una persona, puedes utilizar la librería Joda Time, que es muy útil para hacer operaciones complejas con fechas. Luego sólo tendrás que utilizar estas líneas de código:

DateMidnight cumple = new DateMidnight(1970, 1, 20);
DateTime ahora = new DateTime();
Years edad = Years.yearsBetween(birthdate, now);

Saludos.

Anónimo dijo...

Para definir el Locale, hay que indicar el lenguaje y el país: new Locale(String languaje, String country);
Para español y España sería new Locale("es", "ES"). Indicar que el lenguaje se define con 2 letras minúsculas y el país con 2 mayúsculas.

Felipe Martínez D. dijo...

Hola.

Buena aclaración. Debo añadir que hay varias formas de definir el Locale (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Locale.html), en este ejemplo se ha definido especificando sólo el lenguaje:

new Locale("es_ES") ó new Locale("es") .

Saludos.

Remy Alain Ticona Carbajal dijo...

hola muchas gracias.

Para todas las versiones de android da perfecto.

Anónimo dijo...

Hola... una pregunta, en ese ejemplo que tienes como se podria incrementar el mes, por decir si estamos en Agosto que me muestre Septiembre..

Saludos y muchas gracias...

Felipe Martínez D. dijo...

Hola.

@KARMA, me alegro que de funcione en Android. Gracias a tí por comentar.

@Anónimo: Se puede hacer de forma muy sencilla, aunque utilizando métodos "deprecated", sería así:

int mesActual = fechaDate.getMonth();
fechaDate.setMonth(mesActual + 1);

Sin utilizar métodos "deprecated" habría que convertir el objeto Date en Calendar y hacer la suma mediante los métodos get y set de Calendar:

Calendar cal=Calendar.getInstance();
cal.setTime(date);
...

Saludos.

Anónimo dijo...

Sssssssssssshh.... muchas gracias, funciono perfecto con el metodo que mencionas de "deprecated"..

Saludos que estes bien...

Felipe Martínez D. dijo...

Me alegro!. Gracias a ti por comentar.

Saludos.

Hufex dijo...

hola me podrían ayudar , para convertir una fecha de tipo dd-MMM-YY (02-NOV-12) a tipo YYYY-MM-dd (2012-11-04).
el valor de la fecha (02-NOV-12) se obtiene de un archivos externo. hay alguna clase o forma de convertir el Nov en numero , bueno sin un if o switch

Hufex dijo...

si algo sirve este es la respuesta , me ayudo mucho tu ejemplo mil gracias
Date d =new Date();
SimpleDateFormat formateador = new SimpleDateFormat("dd-MMMM-yy", new Locale("ES"));
try {
d=formateador.parse("02-NOV-12");
System.out.println(f.format(d));
} catch (ParseException ex) {
Logger.getLogger(testOXXO.class.getName()).log(Level.SEVERE, null, ex);
}

Felipe Martínez D. dijo...

Hola Hufex.

Gracias por exponer tu solución.

Saludos.

Unknown dijo...

Saludos, tengo un pequeño problema, hago un sistema (mi tesis) que consta de varias partes, entre ellas, un servidor hecho en java que realiza varias tareas y funciones. Necesito que mi aplicación servidor tome solito la fecha actual del sistema, dependiendo de la fecha borrara unos registros de la base de datos. Necesito que la fecha la tome en el formato: aaaa-mm-dd, por ejemplo la de hoy: 2013-02-20 . Mi problema radica en que cada vez que compilo y ejecuto me aparece la fecha con un mes incorrecto. por ejemplo compilo una vez y me aparece: 2013-01-20 luego unos minutos despues me apareció: 2013-04-20 y la tercera vez: 2013-10-20. Por favor ayudenme.


SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd", Locale.getDefault());
Date hoy = new Date();
String fecha = sdf.format(hoy);
System.out.println(fecha);

Anónimo dijo...

Hola.
Llevo varios días con un problema de formato de fechas. Necesito cambiar el formato origen: yyyy-MM-dd por formato destino: dd-MM-yyyy. La fecha de origen la recojo de un registro en sqlite de un campo DATE. Me he vuelto loco buscando en la red y algunos libros de apoyo que tengo y no doy con la solución. Decri que soy nuevo en java.
Por favor, me puedes indicar como hacerlo.
Muchas gracias...

Felipe Martínez D. dijo...

Hola.

@German: No tengo una respuesta clara a lo que te está pasando. ¿Estás ejecutando tu proyecto en local (en tu PC) o desde un servidor?. Si tu proyecto se ejecuta desde un servidor y está balanceado en varios nodos, puede que la fecha en cada uno de ellos sea distinta, y por eso cada vez que ejecutas te muestra un mes distinto. No estoy seguro de que sea esa la causa. Comprueba la fecha del equipo donde lo ejecutas.

@Anónimo: Debes obtener el objeto Date. Más o menos sería así:

Connection con=DriverManager.getConnection
 ("jdbc:sqlite:misdatos.sqlite");
Statement sent=con.createStatement();
ResultSet rs=sent.executeQuery("SELECT * FROM mitabla");
rs.next();
Date mif=rs.getDate("fecha");
System.out.println("El dia es "+mif.toString());

Una vez que tienes el objeto Date, puedes formatear la fecha con el formato que quieras, tal y como explico en este artículo. (El ejemplo lo he sacado de aquí: http://www.eciformacion.com/noticias/blogs/programacion-en-java/java-sqlite-las-fechas/). Si tienes dudas, puedes volver a preguntarme.


Saludos a los dos.

Anónimo dijo...

hola necesito de su ayuda sobre la fecha e visto que usted tiene programas para convertir la fecha de este modo Lunes,09 de abril de 2013

yo quiero que todo me lo pase a letra nueve de abril de dos mil trece.

me urge.... saludos...

Felipe Martínez D. dijo...

Hola.

Lo que me pides no se puede hacer directamente. Habría que convertir cada número en palabras. Para números de una o dos cifras sería sencillo, pero para números mayores, la cosa se complica. He encontrado el siguiente código que te convierte el número en palabras, pero en inglés. Habría que modificarlo al español. Es el siguiente:

http://www.rgagnon.com/javadetails/java-0426.html



Espero que te sirva.

Saludos.

LuCy dijo...

Me encanto!! muchas gracias! lo mas útil y sencillo que encontré :D

Felipe Martínez D. dijo...


Hola Lucy.

Me alegro de que te gustara.

Gracias por comentar.

Anónimo dijo...

Tengo este metodo como puedo convertirlo a Date despues de realizar el metodo. Gracias
private String getFecha() {
java.util.Date date = new java.util.Date();
java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd");
String fecha = sdf.format(date);
return fecha;
}

Felipe Martínez D. dijo...

Hola.

Simplemente deberías cambiar

"private String getFecha() { "

por

"private Date getFecha() { "

Para que el método te devuelva un objeto de tipo Date.

Creo que eso es a lo que te refieres con tu pregunta. Si no es así, puedes preguntarme nuevamente.

Saludos.

Anónimo dijo...

muy buen aporte y como podria hacer para sumar una semana a la fecha actual??

Felipe Martínez D. dijo...

Hola.

Te recomiendo que mires el post http://felinfo.blogspot.com.es/2015/10/calcular-la-diferencia-en-dias-entre.html . Con la librería Joda Time se puede hacer:

DateTime now = DateTime.now();
DateTime dateTime = now.plusDays(7);

Saludos.

joel dijo...

Excelente solucion, gracias amigos

Felipe Martínez D. dijo...

Me alegro de que te sirviera.

Anónimo dijo...

Hola, mira que ensaye el código, efectivamente dio formato a l fecha pero me sale en ingles

Publicar un comentario

Felinfo: Java, Linux, Virtualización. Open Source.  ©Template Blogger Green by Dicas Blogger .

TOPO