La clase Instant de Java 8 modela un instante en el tiempo. Esta clase es la encargada de guardar un instante con toda su definición (fecha, tiempo hasta el nanosegundo) en un campo de tamaño long.
Tambien es importante que recordemos que Java utiliza como punto de partida para medir el tiempo, 1970-01-01T00:00:00Z guardado en la constante Instant.EPOCH, y que todos los instantes posteriores serán positivos, y los anteriores serán negativos
La clase Instant la vamos a conseguir, la mayoría de las veces, desde otras clases de tiempo, normalmente a través del método instant() que casi todas proporcionan
now(), ofEpochMilli(), ofEpochSecond(), parse()
public static Instant now()
public static Instant now(Clock clock)
public static Instant ofEpochMilli(long epochMilli)
public static Instant ofEpochSecond(long epochSecond)
public static Instant ofEpochSecond(long epochSecond, long nanoAdjustment)
public static Instant parse(CharSequence text)
Obtiene un instante de tiempo de forma autónoma, el instante puede representar
- (now) – El instante actual en el reloj por defecto
- (now(Clock)) – El instante actual, en un reloj determinado
- (ofEpochMilli) – Los milisengundos transcurridos desde el momento EPOCH
- (ofEpochSecond) – Los segundos transcurridos desde el momento EPOCH
- (parse) – Leyendo el tiempo desde una String con formato
2022-12-03T10:15:30.00Z
.
Podemos ver como funcionan, con el siguiente ejemplo
public static void main(String[] args) {
//Fijar momento actual
Instant ahora = Instant.now();
//Fijar instante segun hora MX
Clock clockMX = Clock.system(ZoneId.of("America/Mexico_City"));
Instant ahoraMX = Instant.now(clockMX);
Instant parseado = Instant.parse("2022-11-10T08:00:00.00Z");
System.out.println("ahora :" + ahora);
System.out.println("ahoraMX :" + ahoraMX);
System.out.println("parseado:" + parseado);
}
En consola aparece:
from()
public static Instant from(TemporalAccessor temporal)
Obtiene un objeto Instant representando el momento que ha facilitado clases como OffsetDateTime, ZonedDateTime, o Instant
En el ejemplo vemos algunos casos
public static void main(String[] args) {
// crea ZonedDateTime
ZonedDateTime zonedDateTime = ZonedDateTime.now();
String texto = "2016-10-26T12:31:00.00Z";
// crea Instant
Instant result = Instant.from(zonedDateTime);
Instant mas = Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse("Tue, 3 Jun 2008 11:05:30 GMT"));
Instant fijo = Instant.parse(texto);
System.out.println("Instant: " + result);
System.out.println("mas : " + mas);
System.out.println("fijo : " + fijo);
}
Y en consola:
with()
public Instant with(TemporalAdjuster adjuster)
public Instant with(TemporalField field, long newValue)
Devuelve el objeto, asignando el nuevo valor.
En el ejemplo, modificamos el Instant, o creamos uno nuevo.
public static void main(String[] args) {
// crea un instant
String texto = "2016-10-26T12:31:00.00Z";
Instant fijo = Instant.parse(texto);
System.out.println("fijo : " + fijo);
fijo = fijo.with(Instant.EPOCH);
System.out.println("modif : " + fijo);
Instant modif1 = fijo.with(ChronoField.INSTANT_SECONDS, 10);
System.out.println("modif1 : " + modif1);
}
Y en consola vemos
truncateTo()
public Instant truncatedTo(TemporalUnit unit)
Devuelve una copia del objeto truncado a la unidad especificada
En el ejemplo, vemos como nos desprendemos primero de los segundos y luego de los minutos
public static void main(String[] args) {
// crea un instant
String texto = "2016-10-26T12:31:20.00Z";
Instant base = Instant.parse(texto);
System.out.println("base : " + base);
Instant aminutos = base.truncatedTo(ChronoUnit.MINUTES);
System.out.println("A minutos : " + aminutos);
Instant ahoras = base.truncatedTo(ChronoUnit.HOURS);
System.out.println("A Horas : " + ahoras);
}
Y en consola vemos como nos queda Instant
plus(), plusMillis(), plusNanos(), plusSeconds()
public Instant plus(long amountToAdd, TemporalUnit unit)
public Instant plus(TemporalAmount amountToAdd)
public Instant plusMillis(long millisToAdd)
public Instant plusNanos(long nanosToAdd)
public Instant plusSeconds(long secondsToAdd)
Devuelve una copia del instante actual, después de sumar la cantidad de tiempo indicada. Esa cantidad se la indicaremos en millis, nanos o segundos si utilizamos los métodos orientados, pero también podemos indicar un numero, y la Chronounit que indica su significado, o un objeto TemporalAmount, como pueden ser Duration y Period
En el ejemplo, partimos del instante actual, le sumamos primero 10 segundos, y luego50 milisegundos
public static void main(String[] args) {
// instante inicial
Instant base = Instant.now();
//Añado 10 segundos
Instant m10s = base.plus(10,ChronoUnit.SECONDS);
//Añado 50 ms
Instant m50ms = m10s.plusMillis(50);
System.out.println("base :" + base);
System.out.println("Mas 10 segundos :" + m10s);
System.out.println("Mas 50 milisegundos :" + m50ms);
}
Pudiendo ver el resultado
minus(), minusMillis(), minusNanos(), minusSeconds()
public Instant minus(long amountToSubtract, TemporalUnit unit)
public Instant minus(TemporalAmount amountToSubtract)
public Instant minusMillis(long millisToSubtract)
public Instant minusNanos(long nanosToSubtract)
public Instant minusSeconds(long secondsToSubtract)
Devuelve una copia del instante actual, después de restar la cantidad de tiempo indicada. Esa cantidad se la indicaremos en millis, nanos o segundos si utilizamos los métodos orientados, pero también podemos indicar un numero, y la Chronounit que indica su significado, o un objeto TemporalAmount, como pueden ser Duration y Period
En el ejemplo, partimos del instante actual, le quitamos primero 600 segundos, y luego 200 milisegundos
public static void main(String[] args) {
// instante inicial
Instant base = Instant.now();
//quito 600 segundos(10 minutos)
Instant m600s = base.minus(600,ChronoUnit.SECONDS);
//quito 200 ms
Instant m200ms = m600s.minusMillis(200);
System.out.println("base :" + base);
System.out.println("Menos 600 segundos :" + m600s);
System.out.println("Menos 200 milisegundos :" + m200ms);
}
Podemos revisar la salida
equals(), isAfter(), isBefore(), isSupported()
public boolean equals(Object otherInstant)
public boolean isAfter(Instant otherInstant)
public boolean isBefore(Instant otherInstant)
Compara dos objetos Instant y devuelve true si es cierto lo que se indica en el nombre del método
El ejemplo utilizado para verlo es:
public static void main(String[] args) {
Instant i1 = Instant.parse("2022-11-20T16:55:30.00Z");
Instant i2 = Instant.parse("2022-11-20T16:55:30.00Z");
Instant i3 = Instant.now();
System.out.println("Instant1: " + i1);
System.out.println("Instant2: " + i2);
System.out.println("Instant3: " + i3);
// compara equal y presenta
boolean value = i1.equals(i2);
System.out.println("Son iguales i1 e i2?: " + value);
boolean antes = i1.isAfter(i3);
System.out.println("es i1 anterior a i3?: " + antes);
}
Que hara aparecer en la consola
Para la detección de soportados:
public boolean isSupported(TemporalUnit unit)
public boolean isSupported(TemporalField field)
Devuelve True si el contenido de Instant soporta el campo indicado
Los TemporalField (ChronoField) soportados por Instant son
- NANO_OF_SECOND
- MICRO_OF_SECOND
- MILLI_OF_SECOND
- INSTANT_SECONDS
Las TemporalUnits (ChronoUnits) soportados por Instant son
- NANOS
- MICROS
- MILLIS
- SECONDS
- MINUTES
- HOURS
- HALF_DAYS
- DAYS
Si preparamos una prueba como
public static void main(String[] args) {
Instant in = Instant.now();
boolean ms = in.isSupported(ChronoField.MILLI_OF_SECOND);
boolean dw = in.isSupported(ChronoField.DAY_OF_WEEK);
boolean mo = in.isSupported(ChronoUnit.MONTHS);
System.out.println("Soporta ChronoField.MILLI_OF_SECOND:"+ms);
System.out.println("Soporta ChronoField.DAY_OF_WEEK:"+dw);
System.out.println("Soporta ChronoUnit.MONTHS:"+mo);
}
Recibiremos en salida
compareTo()
public int compareTo(Instant otherInstant)
Compara dos instant y devuelve -1, 0, o 1, según cual sea mayor, o si son iguales
public static void main(String[] args) {
Instant i1 = Instant.parse("2022-11-20T16:55:30.00Z");
Instant i2 = Instant.now();
System.out.println("Instant1: " + i1);
System.out.println("Instant2: " + i2);
// compara equal y presenta
int value = i1.compareTo(i2);
System.out.println("la comparacion da ?: " + value);
}
El resultado es
get(), getLong()
public int get(TemporalField field)
public long getLong(TemporalField field)
Obtiene el valor del Instant en la unidad que se indique (siempre que sea una de las soportadas.
En el ejemplo, convertimos el Instant en segundos; debemos utilizar getLong por un tema de rango.
public static void main(String[] args) {
Instant i1 = Instant.parse("2022-11-20T16:55:30.00Z");
System.out.println("Instant1: " + i1);
long value = i1.getLong(ChronoField.INSTANT_SECONDS);
System.out.println("en segundos: " + value);
}
El resultado es
getEpochSecond()
public long getEpochSecond()
Devuelve el numero de segundos transcurridos desde 1970-01-01T00:00:00Z. hasta el instante actual
En el ejemplo, como trabajamos con el mismo valor inicial que en el ejercicio anterior, este método obtendrá el mismo resultado
public static void main(String[] args) {
Instant i1 = Instant.parse("2022-11-20T16:55:30.00Z");
System.out.println("Instant1: " + i1);
long value = i1.getEpochSecond();
System.out.println("en segundos: " + value);
}
Aqui esta:
getNano()
public long getNano()
Obtiene los nanosegundos transcurridos en el ultimo minuto
En el ejemplo, hemos modificado el instante para que haya pasado 100 milisegundos del ultimo segundo
public static void main(String[] args) {
Instant i1 = Instant.parse("2022-11-20T16:55:30.10Z");
System.out.println("Instant1: " + i1);
long value = i1.getNano();
System.out.println("en segundos: " + value);
}
Entonce, en la salida, poremos ver cuantos nanosegundos han transcurrido
until()
public long until(Temporal endExclusive, TemporalUnit unit)
Devuelve la cantidad de tiempo que falta hasta el Instant indicado, en la unidad solicitada
Para el ejemplo, hemos conseguido un instamte, y luego le hemos sumado 10 segundos; Solo tenemos que hacer el until, para comprobar que así ha sido
public static void main(String[] args) {
// instante inicial
Instant base = Instant.now();
//Añado 10 segundos
Instant m10s = base.plus(10,ChronoUnit.SECONDS);
long segundos = base.until(m10s, ChronoUnit.SECONDS);
System.out.println("base :" + base);
System.out.println("Mas 10 segundos :" + m10s);
System.out.println("Until en segundos:" + segundos);
}
Y lo vemos en el resultado
range()
public ValueRange range(TemporalField field)
Devuelve el rango de valores para el campo, en las unidades indicadas
Si queremos obtener un campo de rango para poder filtrar entradas, lo podríamos hacer así
public static void main(String[] args) {
// instante inicial
Instant base = Instant.now();
ValueRange range1 = base.range(ChronoField.MILLI_OF_SECOND);
ValueRange range2 = base.range(ChronoField.MICRO_OF_SECOND);
ValueRange range3 = base.range(ChronoField.NANO_OF_SECOND);
System.out.println("base: " + base);
System.out.println(" Rango en MILLI_OF_SECOND is: " + range1);
System.out.println(" Rango en MICRO_OF_SECOND is: " + range2);
System.out.println(" Rango en NANO_OF_SECOND is: " + range3);
}
Y obtendríamos
adjustInto()
public Temporal adjustInto(Temporal temporal)
Ajusta el objeto temporal a este instante
En el ejemplo, cambiamos la fecha y respetamos la hora
public static void main(String[] args) {
ZonedDateTime date = ZonedDateTime.now();
System.out.println("Fijo:" + date);
LocalDate date1 = LocalDate.parse("2015-01-31");
date = (ZonedDateTime)date1.adjustInto(date);
// print results
System.out.println("Date " + date);
}
En la consola vemos lo hecho
atOffset(), atZone()
public OffsetDateTime atOffset(ZoneOffset offset)
public ZonedDateTime atZone(ZoneId zone)
Combina el instante con la información facilitada, para obtener el objeto previsto
En el ejemplo, obtenemos un instante concreto, y luego cambiamos su offset, y su zonaId
public static void main(String[] args) {
Instant instant = Instant.parse("2022-11-15T14:22:30.00Z");
System.out.println("Instant: " + instant);
ZoneOffset offset = ZoneOffset.ofTotalSeconds(7200);
OffsetDateTime offsetDate = instant.atOffset(offset);
System.out.println("Offset Fecha y hora: " + offsetDate);
ZoneId zone = ZoneId.of("America/Mexico_City");
ZonedDateTime result = instant.atZone(zone);
System.out.println("ZonedDateTime: " + result);
}
Y su resultado
Conclusión
Este objeto, establece uno de los valores que mas habitualmente trabajamos; el instante. y es una de las aportaciones de Java 8 que están dentro de la api de tiempo que proporciona esta version (java.time)
Podéis ver otros objetos de está api y que, seguro, vais a necesitar, siguiendo este articulo
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.