Mostrando entradas con la etiqueta fechas. Mostrar todas las entradas
Mostrando entradas con la etiqueta fechas. Mostrar todas las entradas

10 oct 2016

Manejo de fechas en Java

java.util.Date


Durante mucho tiempo la clase utilizada para manejar fechas fue java.util.Date, pero hoy día muchos de sus métodos se consideran obsoletos.

java.util.Calendar


Posteriormente se utilizó la clase java.util.Calendar y java.util.GregorianCalendar. Su principal diferencia con Date, es que Calendar es mutable, permite cambiar el valor de un objeto sin tener que generar un nuevo objeto.
Calendar es una clase abstracta por lo que sus objetos deben instanciarse a través de alguna de sus clases heredadas, por ejemplo con el método getInstance() que nos devolvería la fecha actual del sistema o bien con GregorianCalendar, que sí es instanciable. Ejemplos:

Calendar hoy= Calendar.getInstance();
Calendar hoy= new GregorianCalendar();

Calendar dispone de métodos “get” y “set” que permiten recuperar o almacenar valores de las fechas, los correspondientes al argumento pasado, pero también tiene métodos “add” y “roll” que permiten a partir de unos valores incrementar o decrementar las fechas, recalculando las fechas correctas si es necesario.

Ejemplo:


Si quisiéramos darle valores, por ejemplo de una fecha de nacimiento, sería:



La clase Calendar permite trabajar de dos modos, en un modo indulgente o permisivo (Lenient), que es el que está activo por defecto, y que nos permitiría almacenar fechas sin realizar validaciones, por ejemplo darle al atributo día el valor 34, o no tener en cuenta sin un año es bisiesto, y un modo más restrictivo, que produciría una excepción de tipo IllegalArgumentException, si los parámetros de la fecha no son correctos.
Para activar el modo restrictivo, o no indulgente, pondríamos:
nacim.setLenient(false);

El ejemplo anterior con una fecha no válida, daría el siguiente resultado:



Paquete java.time


A partir de la versión 8 de Java se recomienda el uso del paquete java.time. Este paquete contiene clases para tratar fechas, tiempos, instantes y duraciones. Por ejemplo LocalTime, permite almacenar horas sin fecha, como: 14:37:26;  LocalDate, sirve para almacenar fechas sin hora, como 2015-05-22; LocalDateTime, permite almacenar fechas con hora.

LocalDate

Los objetos se crean con el método estático of() de la clase LocalDate.
LocalDate fecha = LocalDate.of(2016, 3, 27);

Si lo que queremos es obtener la fecha actual del sistema, utilizaremos el método now():
LocalDate ahora = LocalDate.now();

Dispone de métodos get para obtener los componentes día, mes y año de una fecha:
int dia, mes, anno;
dia= fecha.getDayOfMonth();
mes= fecha.getMonthValue(); //devuelve valores 1..12
anno= fecha.getYear();

Otros métodos get:
DayOfWeek diaSemana= fecha.getDayOfWeek();
Month nombreMes= fecha.getMonth();

Tiene métodos para incrementar, plus(), o para hacer retroceder una fecha, minus(). Estos métodos admiten dos argumentos el primero es el número de unidades y el segundo que expresa el tipo de unidades, mediante el tipo enumerado ChronoUnit, que tiene valores como DAYS, WEEKS, MONTHS o YEARS. Ejemplos:
LocalDate fecha2= fecha1.plus(5, ChronoUnit.MONTHS); //Aumenta fecha1, 5 meses
LocalDate fecha2= fecha1.minus(3, ChronoUnit.DAYS); //Disminuye fecha1, 3 días

Otros métodos interesantes:
·         isLeapYear()      verifica si un año es bisiesto
·         until()                   permite calcular el tiempo entre dos fechas
·         parse()                 permite analizar una cadena para generar una fecha

Para establecer el formato de las fechas, se utiliza la clase DateTimeFormatter.

10 abr 2014

Cadenas de formato en Java

Permiten mejorar la salida proporcionando mecanismos para justificar y alinear formatos numéricos, de cadenas y de fechas. El funcionamiento de estas cadenas está basado en el del lenguaje C, por lo que su similitud es grande, aunque no total, porque Java es más restrictivo y donde C ignora un error, Java puede generar una excepción.
Cada método que genera una salida formateada, por ejemplo printf, utiliza una cadena de formato de tipo String y una lista de argumentos.
El String, puede contener texto fijo y uno o más especificadores de formato que comienzan por el símbolo %.
Ej.: printf(“Nombre: %s, Edad: %d, Sueldo: %7.2”, nombre, edad, sueldo);
Salida:        Nombre: Ana Pérez, Edad: 28, Sueldo: 1856,45

Especificador de formato para caracteres y números.
 %[índice$] [flags] [ancho] [.precisión] conversión
[índice$]
índice es un número entero que nos indica la posición del argumento en la lista de argumentos. El primer argumento será 1$, el segundo 2$ y así sucesivamente. Nos va a permitir cambiar el orden o repetir argumentos.
[flags]
Son una serie de caracteres que modifican el aspecto de la salida, por ejemplo la alineación.
[ancho]
El número mínimo de caracteres que será escrito en la salida.
[.precisión]
Sirve para restringir el número de decimales o de caracteres. Para los argumentos de tipo general es el máximo número de caracteres que será escrito en la salida. Para los números de coma flotante (‘e’, ‘E’, ‘f’) es el número de decimales después del separador. Si la conversión es ‘g’ o ‘G’, es el número de dígitos de la magnitud resultante después del redondeo. Para la conversión ‘a’ o ‘A’, no debe utilizarse. Para carácter, enteros y fechas, no se puede utilizar, porque produciría una excepción.
conversión
Indica el tipo al que hay que acomodar el resultado.


Especificador de formato para fechas y horas.
 %[índice$] [flags] [ancho]  conversión
índice, flags y ancho
       tienen el mismo significado que en el apartado anterior.
conversión
Es una secuencia de dos caracteres. El primero de ellos tiene que ser ‘t’ o ‘T’, y el segundo indica el formato que tiene que ser usado.

Conversión

Está dividido en las siguientes categorías:
1.     General – puede ser aplicado a cualquier tipo
2.     Carácter – puede ser aplicado a tipos básicos de caracteres Unicode: charCharacterbyteByteshort, and Short. También puede ser aplicado a los tipos int and Integer cuando Character.isValidCodePoint (int) devuelve true
3.     Numérico
1.     Entero – puede ser aplicado a los tipos enteros de Java: byte, Byte, short, Short, int,Integer, long, Long, y BigInteger
2.     Coma flotante – puede ser aplicado a los tipos: float, Float, double, Double, y BigDecimal
4.     Fecha/Hora - puede ser aplicado a los tipos Java que son capaces de codificar una fecha u hora: long, Long, Calendar, y Date.
5.     Tanto por ciento - produce un literal '%' ('\u0025')
6.     Salto de línea – produce  el carácter de salto de línea del sistema


En la siguiente tabla se recogen los caracteres de Conversión. Cuando aparecen en mayúsculas tienen el mismo significado que en minúsculas, pero convierten el resultado a mayúsculas como si se estuviera invocando a String.toUpperCase()

Conversión
Categorías
Descripción
'b''B'
general
Si el argumento es null, el resultado es "false". Si es boolean o Boolean, el resultado es la cadena devuelta por String.valueOf(arg). En otro caso el resultado es "true".
'h''H'
general
Si el argumento es null, el resultado es "null". En otro caso, el resultado se obtiene invocando a Integer.toHexString(arg.hashCode()).
's''S'
general
Si el argumento es null, el resultado es "null". Si el argumento implementa Formattable, entonces se invoca arg.formatTo. En otro caso el resultado se obtiene invocando a arg.toString().
'c''C'
carácter
El resultado es un carácter Unicode
'd'
entero
El resultado es formateado como un entero en base decimal
'o'
entero
Es formateado como un entero en base octal
'x''X'
entero
Es formateado como un entero en base hexadecimal
'e''E'
coma
Es formateado como un número decimal en notación científica
'f'
flotante
Es formateado como un número decimal
'g''G'
coma flotante
Es formateado con formato decimal o con notación científica, dependiendo de la precisión y del valor después del redondeo
'a''A'
coma flotante
Es formateado como un número hexadecimal en coma flotante con una mantisa y un exponente
't''T'
fecha/hora
Prefijo para los caracteres de conversión de fecha y hora.
'%'
tanto por ciento
El resultado es el literal '%' ('\u0025')
'n'
salto de línea
El resultado es el salto de línea de la plataforma


Conversiones de fecha/hora
Los caracteres de la siguiente tabla están definidos como sufijos de los caracteres de conversión 't' y 'T'.

Para formatear horas:
'H'
Hora, con dos dígitos, de 00 a 23.
'I'
Hora, con dos dígitos, de 01 a 12.
'k'
Hora, con formato de 0 a 23.
'l'
Hora, con formato de 1 a 12.
'M'
Minutos, con dos dígitos, de 00 a 59.
'S'
Segundos, con dos dígitos, de 00 a 60 (60" es un valor especial para soportar los saltos).
'L'
Milisegundos, con tres dígitos, de 000 a 999.
'N'
Nanosegundos, con 9 dígitos, de 000000000 a 999999999.
'p'
Especificador local para indicar tarde o mañana, por ejemplo "am" o "pm".
'z'
Desplazamiento del GMT, según el estilo numérico de la RFC 822  Por ej. -0800.
'Z'
Una cadena representando la abreviatura de la zona horaria.
's'
Segundos transcurridos desde el 1 de enero de 1970 00:00:00 UTC
'Q'
Milisegundos desde el  1 de enero de 1970 00:00:00 UTC

Para formatear fechas:
'B'
Cadena con el nombre completo del mes
'b'
Cadena con la abreviatura del nombre del mes
'h'
Igual que 'b'
'A'
Cadena con el nombre completo del día de la semana
'a'
Cadena con la abreviatura del nombre del día de la semana
'C'
Año, con dos dígitos, de 00 a 99,obtenidos dividiendo el año completo entre 100 
'Y'
Año, formateado con al menos 4 dígitos
'y'
Últimos 2 dígitos del año, con valores de  00 a 99
'j'
Día del año, con tres dígitos de 001 a 366
'm'
Mes, con dos dígitos de 01 a 12
'd'
Día del mes, con dos dígitos, de 01 a 31
'e'
Día del mes, de 1 a 31

Para formatear conjuntos de fecha y hora:
'R'
Hora, con formato 24 horas, como "%tH:%tM"
'T'
Hora, con format 24 horas, como "%tH:%tM:%tS"
'r'
Hora, con formato 12 horas, como "%tI:%tM:%tS %Tp"
'D'
Fecha, con formato "%tm/%td/%ty"
'F'
Fecha, con formato "%tY-%tm-%td"
'c'
Fecha y hora, con formato  "%ta %tb %td %tT %tZ %tY"

Flags
Flag
General
Carácter
Entero
coma flotante
Fecha/Hora
Descripción
'-'
X
X
X
X
X
El resultado se ajustará a la izquierda
'#'
X1
-
X3
X
-
El resultado utilizará una forma alternativa de conversión
'+'
-
-
X4
X
-
El resultado siempre incluirá un signo
'  '
-
-
X4
X
-
El resultado incluirá un espacio inicial para los valores positivos
'0'
-
-
X
X
-
El resultado será rellenado con ceros
','
-
-
X2
X5
-
El resultado incluirá los separadores definidos en la configuración local
'('
-
-
X4
X5
-
Aparecerán los número negativos entre paréntesis
1 Depende de la definición de Formattable.
2 Sólo para 'd'
3 Sólo para 'o', 'x', y 'X' 
4 Para 'd', 'o', 'x', y 'X' aplicado a BigInteger, o 'd' aplicado a  byte, Byte, short, Short, int, Integer, long, y Long
5 Sólo para 'e', 'E', 'f', 'g', y 'G'