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

Java SE 8

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)));
Java SE 8

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:

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 predeterminado new 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

  1. LocalTime time = LocalTime.now();
  2. time = LocalTime.MIDNIGHT;
  3. time = LocalTime.NOON;
  4. 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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow