Enjoy A New Student Discount All 55,000 Courses on sale for Only $12.99

Ends in 05h 23m 49s

Java 8 – Instant

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

Deja un comentario

/*Si te ha gustado el artículo
no dudes en compartirlo*/

Facebook
Twitter
LinkedIn

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies

Ver mi IP

Ver ip de mi máquina
tipo valor
Ip: 18.221.129.19
Proxy: 18.221.129.19
Remote host: ec2-18-221-129-19.us-east-2.compute.amazonaws.com
Remote port: 55106
** 18.221.129.19, 172.69.59.56