Java Language
Clase de fecha
Buscar..
Sintaxis
-
Date object = new Date();
-
Date object = new Date(long date);
Parámetros
Parámetro | Explicación |
---|---|
Sin parametro | Crea un nuevo objeto Date utilizando el tiempo de asignación (al milisegundo más cercano) |
fecha larga | Crea un nuevo objeto Fecha con la hora establecida en el número de milisegundos desde "la época" (1 de enero de 1970, 00:00:00 GMT) |
Observaciones
Representación
Internamente, un objeto de fecha Java se representa como un largo; es el número de milisegundos desde un tiempo específico (conocido como la época ). La clase de fecha de Java original tenía métodos para tratar con zonas horarias, etc., pero estos estaban en desuso en favor de la nueva clase de calendario.
Por lo tanto, si todo lo que desea hacer en su código es una hora específica, puede crear una clase de Fecha y almacenarla, etc. Si desea imprimir una versión legible por humanos de esa fecha, sin embargo, cree una clase de Calendario. y use su formato para producir horas, minutos, segundos, días, zonas horarias, etc. Recuerde que un milisegundo específico se muestra como horas diferentes en diferentes zonas horarias; Normalmente, usted desea mostrar uno en la zona horaria "local", pero los métodos de formato deben tener en cuenta que es posible que desee mostrarlo para otro.
También tenga en cuenta que los relojes utilizados por las JVM no suelen tener una precisión de milisegundos; el reloj solo puede "marcar" cada 10 milisegundos y, por lo tanto, si sincroniza las cosas, no puede confiar en medirlas con precisión a ese nivel.
Declaración de importación
import java.util.Date;
La clase de Date
se puede importar del paquete java.util
.
Precaución
Date
instancias de Date
son mutables, por lo que su uso puede dificultar la escritura de código seguro para subprocesos o puede proporcionar accidentalmente acceso de escritura al estado interno. Por ejemplo, en la siguiente clase, el método getDate()
permite a la persona que llama modificar la fecha de la transacción:
public final class Transaction {
private final Date date;
public Date getTransactionDate() {
return date;
}
}
La solución es devolver una copia del campo de date
o usar las nuevas API en java.time
introducidas en Java 8.
La mayoría de los métodos de construcción en la clase Date
han quedado en desuso y no deben usarse. En casi todos los casos, es recomendable utilizar la clase Calendar
para las operaciones de fecha.
Java 8
Java 8 introduce una nueva API de fecha y hora en el paquete java.time
, que incluye LocalDate y LocalTime . Las clases en el paquete java.time
proporcionan una API revisada que es más fácil de usar. Si está escribiendo en Java 8, le recomendamos encarecidamente que utilice esta nueva API. Consulte Fechas y hora (java.time. *) .
Creando objetos de fecha
Date date = new Date();
System.out.println(date); // Thu Feb 25 05:03:59 IST 2016
Aquí, este objeto Date
contiene la fecha y hora actuales en que se creó este objeto.
Calendar calendar = Calendar.getInstance();
calendar.set(90, Calendar.DECEMBER, 11);
Date myBirthDate = calendar.getTime();
System.out.println(myBirthDate); // Mon Dec 31 00:00:00 IST 1990
Date
objetos de Date
se crean mejor a través de una instancia de Calendar
, ya que el uso de los constructores de datos está obsoleto y no se recomienda. Para hacerlo, necesitamos obtener una instancia de la clase Calendar
del método de fábrica. Luego podemos establecer el año, mes y día del mes utilizando números o, en el caso de las constantes de los meses que se proporcionan en la clase Calendario, para mejorar la legibilidad y reducir los errores.
calendar.set(90, Calendar.DECEMBER, 11, 8, 32, 35);
Date myBirthDatenTime = calendar.getTime();
System.out.println(myBirthDatenTime); // Mon Dec 31 08:32:35 IST 1990
Junto con la fecha, también podemos pasar el tiempo en el orden de horas, minutos y segundos.
Comparando objetos de fecha
Calendario, fecha y fecha local
Antes, después, compare y métodos iguales.
//Use of Calendar and Date objects
final Date today = new Date();
final Calendar calendar = Calendar.getInstance();
calendar.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date birthdate = calendar.getTime();
final Calendar calendar2 = Calendar.getInstance();
calendar2.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date samebirthdate = calendar2.getTime();
//Before example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.before(birthdate)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", today, today, Boolean.valueOf(today.before(today)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.before(today)));
//After example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(birthdate)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(today)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.after(today)));
//Compare example
System.out.printf("Compare %1$tF to %2$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(birthdate)));
System.out.printf("Compare %1$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(today)));
System.out.printf("Compare %2$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(birthdate.compareTo(today)));
//Equal example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.equals(birthdate)));
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", birthdate, samebirthdate,
Boolean.valueOf(birthdate.equals(samebirthdate)));
System.out.printf(
"Because birthdate.getTime() -> %1$d is different from samebirthdate.getTime() -> %2$d, there are millisecondes!%n",
Long.valueOf(birthdate.getTime()), Long.valueOf(samebirthdate.getTime()));
//Clear ms from calendars
calendar.clear(Calendar.MILLISECOND);
calendar2.clear(Calendar.MILLISECOND);
birthdate = calendar.getTime();
samebirthdate = calendar2.getTime();
System.out.printf("Is %1$tF equal to %2$tF after clearing ms? %3$b%n", birthdate, samebirthdate,
Boolean.valueOf(birthdate.equals(samebirthdate)));
isBefore, isAfter, compareTo y es igual a métodos
//Use of LocalDate
final LocalDate now = LocalDate.now();
final LocalDate birthdate2 = LocalDate.of(2012, 6, 30);
final LocalDate birthdate3 = LocalDate.of(2012, 6, 30);
//Hours, minutes, second and nanoOfsecond can also be configured with an other class LocalDateTime
//LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
//isBefore example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(birthdate2)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(now)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isBefore(now)));
//isAfter example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(birthdate2)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(now)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isAfter(now)));
//compareTo example
System.out.printf("Compare %1$tF to %2$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(birthdate2)));
System.out.printf("Compare %1$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(now)));
System.out.printf("Compare %2$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(birthdate2.compareTo(now)));
//equals example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.equals(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.equals(birthdate3)));
//isEqual example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isEqual(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.isEqual(birthdate3)));
Comparación de fechas antes de Java 8
Antes de Java 8, las fechas podían compararse utilizando las clases java.util.Calendar y java.util.Date . La clase de fecha ofrece 4 métodos para comparar fechas:
after
, before
, compareTo
y equals
métodos comparan los valores devueltos por getTime () método para cada fecha.
compareTo
método compareTo
devuelve un entero positivo.
- Valor mayor que 0: cuando la fecha es posterior al argumento de fecha
- Valor mayor que 0: cuando la fecha es anterior al argumento de fecha
- El valor es igual a 0: cuando la fecha es igual al argumento de la fecha
equals
resultados equals
pueden ser sorprendentes como se muestra en el ejemplo porque los valores, como los milisegundos, no se inicializan con el mismo valor si no se dan explícitamente.
Desde Java 8
Con Java 8, está disponible un nuevo Objeto para trabajar con Fecha java.time.LocalDate . LocalDate
implementa ChronoLocalDate , la representación abstracta de una fecha donde la cronología, o sistema de calendario, es conectable.
Para tener la precisión de fecha y hora, se debe usar el objeto java.time.LocalDateTime . LocalDate
y LocalDateTime
usan el mismo nombre de método para comparar.
La comparación de fechas con LocalDate
es diferente de usar ChronoLocalDate
porque la cronología o el sistema de calendario no se tienen en cuenta en la primera.
Debido a que la mayoría de las aplicaciones deben usar LocalDate
, ChronoLocalDate
no se incluye en los ejemplos. Lectura adicional aquí .
La mayoría de las aplicaciones deben declarar firmas de métodos, campos y variables como LocalDate, no esta interfaz [ChronoLocalDate].
LocalDate
tiene 5 métodos para comparar fechas:
- isAfter (ChronoLocalDate other)
- isBefore (ChronoLocalDate other)
- isEqual (ChronoLocalDate otro)
- compareTo (ChronoLocalDate otro)
- es igual a (objeto obj)
En el caso del parámetro LocalDate
, isAfter
, isBefore
, isEqual
, equals
y compareTo
ahora use este método:
int compareTo0(LocalDate otherDate) {
int cmp = (year - otherDate.year);
if (cmp == 0) {
cmp = (month - otherDate.month);
if (cmp == 0) {
cmp = (day - otherDate.day);
}
}
return cmp;
}
equals
verificación de método si la referencia del parámetro es igual a la fecha primero, mientras que isEqual
llama directamente a compareTo0
.
En el caso de una instancia de otra clase de ChronoLocalDate
las fechas se comparan utilizando el Epoch Day
la Epoch Day
. El recuento del día de la época es un recuento incremental simple de días donde el día 0 es 1970-01-01 (ISO).
Convertir la fecha a un determinado formato de cadena
format()
de la clase SimpleDateFormat
ayuda a convertir un objeto Date
en cierto objeto String
formato utilizando la cadena de patrón suministrada.
Date today = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy"); //pattern is specified here
System.out.println(dateFormat.format(today)); //25-Feb-16
Los patrones se pueden aplicar de nuevo utilizando applyPattern()
dateFormat.applyPattern("dd-MM-yyyy");
System.out.println(dateFormat.format(today)); //25-02-2016
dateFormat.applyPattern("dd-MM-yyyy HH:mm:ss E");
System.out.println(dateFormat.format(today)); //25-02-2016 06:14:33 Thu
Nota: Aquí mm
(letra minúscula m) denota minutos y MM
(mayúscula M) denota mes. Preste mucha atención al formatear los años: el capital "Y" ( Y
) indica la "semana del año", mientras que la minúscula "y" ( y
) indica el año.
Convertir cadena en fecha
parse()
de la clase SimpleDateFormat
ayuda a convertir un patrón de String
en un objeto Date
.
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
String dateStr = "02/25/2016"; // input String
Date date = dateFormat.parse(dateStr);
System.out.println(date.getYear()); // 116
Hay 4 estilos diferentes para el formato de texto, SHORT
, MEDIUM
(este es el valor predeterminado), LONG
y FULL
, todos los cuales dependen de la configuración regional. Si no se especifica una configuración regional, se utiliza la configuración regional predeterminada del sistema.
Estilo | Locale.US | Locale.France |
---|---|---|
CORTO | 30/6/09 | 30/06/09 |
MEDIO | Jun 30, 2009 | 30 juin 2009 |
LARGO | 30 de junio de 2009 | 30 juin 2009 |
COMPLETO | Martes 30 de junio de 2009 | mardi 30 juin 2009 |
Una fecha básica de salida.
Usando el siguiente código con la cadena de formato yyyy/MM/dd hh:mm.ss
, recibiremos la siguiente salida
2016/04/19 11: 45.36
// define the format to use
String formatString = "yyyy/MM/dd hh:mm.ss";
// get a current date object
Date date = Calendar.getInstance().getTime();
// create the formatter
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatString);
// format the date
String formattedDate = simpleDateFormat.format(date);
// print it
System.out.println(formattedDate);
// single-line version of all above code
System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm.ss").format(Calendar.getInstance().getTime()));
Convertir la representación de cadena formateada de la fecha en el objeto Fecha
Este método se puede usar para convertir una representación de cadena formateada de una fecha en un objeto Date
.
/**
* Parses the date using the given format.
*
* @param formattedDate the formatted date string
* @param dateFormat the date format which was used to create the string.
* @return the date
*/
public static Date parseDate(String formattedDate, String dateFormat) {
Date date = null;
SimpleDateFormat objDf = new SimpleDateFormat(dateFormat);
try {
date = objDf.parse(formattedDate);
} catch (ParseException e) {
// Do what ever needs to be done with exception.
}
return date;
}
Creando una fecha específica
Si bien la clase de fecha de Java tiene varios constructores, notará que la mayoría está en desuso. La única forma aceptable de crear una instancia de Fecha directamente es usando el constructor vacío o pasando un largo (número de milisegundos desde el tiempo base estándar). Tampoco son útiles a menos que esté buscando la fecha actual o tenga otra instancia de Date ya disponible.
Para crear una nueva fecha, necesitará una instancia de Calendario. Desde allí puede establecer la instancia de Calendario en la fecha que necesite.
Calendar c = Calendar.getInstance();
Esto devuelve un nuevo conjunto de instancias de Calendario a la hora actual. El calendario tiene muchos métodos para mutar su fecha y hora o establecerlo de forma absoluta. En este caso, lo estableceremos en una fecha específica.
c.set(1974, 6, 2, 8, 0, 0);
Date d = c.getTime();
El método getTime
devuelve la instancia de fecha que necesitamos. Tenga en cuenta que los métodos de configuración del calendario solo establecen uno o más campos, no los configuran todos. Es decir, si establece el año, los otros campos permanecerán sin cambios.
TRAMPA
En muchos casos, este fragmento de código cumple su propósito, pero tenga en cuenta que dos partes importantes de la fecha / hora no están definidas.
- los parámetros
(1974, 6, 2, 8, 0, 0)
se interpretan dentro de la zona horaria predeterminada, definida en otro lugar, - los milisegundos no se establecen en cero, pero se llenan desde el reloj del sistema en el momento en que se crea la instancia de Calendario.
Objetos Java 8 LocalDate y LocalDateTime
Los objetos Date y LocalDate no se pueden convertir exactamente entre sí ya que un objeto Date representa un día y una hora específicos, mientras que un objeto LocalDate no contiene información de hora o zona horaria. Sin embargo, puede ser útil convertir entre los dos si solo te importa la información de la fecha real y no la información de la hora.
Crea una fecha local
// Create a default date
LocalDate lDate = LocalDate.now();
// Creates a date from values
lDate = LocalDate.of(2017, 12, 15);
// create a date from string
lDate = LocalDate.parse("2017-12-15");
// creates a date from zone
LocalDate.now(ZoneId.systemDefault());
Crea un LocalDateTime
// Create a default date time
LocalDateTime lDateTime = LocalDateTime.now();
// Creates a date time from values
lDateTime = LocalDateTime.of(2017, 12, 15, 11, 30);
// create a date time from string
lDateTime = LocalDateTime.parse("2017-12-05T11:30:30");
// create a date time from zone
LocalDateTime.now(ZoneId.systemDefault());
Fecha local hasta la fecha y viceversa
Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();
// Date to LocalDate
LocalDate localDate = date.toInstant().atZone(defaultZoneId).toLocalDate();
// LocalDate to Date
Date.from(localDate.atStartOfDay(defaultZoneId).toInstant());
LocalDateTime to Date y viceversa
Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();
// Date to LocalDateTime
LocalDateTime localDateTime = date.toInstant().atZone(defaultZoneId).toLocalDateTime();
// LocalDateTime to Date
Date out = Date.from(localDateTime.atZone(defaultZoneId).toInstant());
Zonas horarias y java.util.Date
Un objeto java.util.Date
no tiene un concepto de zona horaria.
- No hay manera de establecer una zona horaria para una fecha
- No hay forma de cambiar la zona horaria de un objeto Date
- Un objeto Date creado con el
new Date()
constructor predeterminadonew Date()
se inicializará con la hora actual en la zona horaria predeterminada del sistema
Sin embargo, es posible mostrar la fecha representada por el punto en el tiempo descrito por el objeto Date en una zona horaria diferente utilizando, por ejemplo, java.text.SimpleDateFormat
:
Date date = new Date();
//print default time zone
System.out.println(TimeZone.getDefault().getDisplayName());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //note: time zone not in format!
//print date in the original time zone
System.out.println(sdf.format(date));
//current time in London
sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println(sdf.format(date));
Salida:
Central European Time
2016-07-21 22:50:56
2016-07-21 21:50:56
Convertir java.util.Date a java.sql.Date
java.util.Date
to java.sql.Date
conversión suele ser necesaria cuando un objeto Date debe escribirse en una base de datos.
java.sql.Date
es un envoltorio alrededor de un valor de milisegundos y JDBC
utiliza para identificar un tipo de SQL DATE
En el siguiente ejemplo, usamos el constructor java.util.Date()
, que crea un objeto Date y lo inicializa para representar el tiempo en el milisegundo más cercano. Esta fecha se utiliza en el método convert(java.util.Date utilDate)
para devolver un objeto java.sql.Date
Ejemplo
public class UtilToSqlConversion {
public static void main(String args[])
{
java.util.Date utilDate = new java.util.Date();
System.out.println("java.util.Date is : " + utilDate);
java.sql.Date sqlDate = convert(utilDate);
System.out.println("java.sql.Date is : " + sqlDate);
DateFormat df = new SimpleDateFormat("dd/MM/YYYY - hh:mm:ss");
System.out.println("dateFormated date is : " + df.format(utilDate));
}
private static java.sql.Date convert(java.util.Date uDate) {
java.sql.Date sDate = new java.sql.Date(uDate.getTime());
return sDate;
}
}
Salida
java.util.Date is : Fri Jul 22 14:40:35 IST 2016
java.sql.Date is : 2016-07-22
dateFormated date is : 22/07/2016 - 02:40:35
java.util.Date
tiene información de fecha y hora, mientras que java.sql.Date
solo tiene información de fecha
Hora local
Para usar solo la parte de tiempo de una fecha use LocalTime. Puede crear una instancia de un objeto LocalTime en un par de maneras
-
LocalTime time = LocalTime.now();
-
time = LocalTime.MIDNIGHT;
-
time = LocalTime.NOON;
-
time = LocalTime.of(12, 12, 45);
LocalTime
también tiene un método toString incorporado que muestra el formato muy bien.
System.out.println(time);
También puede obtener, sumar y restar horas, minutos, segundos y nanosegundos del objeto LocalTime, es decir,
time.plusMinutes(1);
time.getMinutes();
time.minusMinutes(1);
Puedes convertirlo en un objeto Date con el siguiente código:
LocalTime lTime = LocalTime.now();
Instant instant = lTime.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);
esta clase funciona muy bien dentro de una clase de temporizador para simular un reloj de alarma.