La clase Duration puede contener cantidad de tiempo en términos de segundos y nanosegundos. Se puede acceder a él utilizando otras unidades basadas en la duración, como minutos y horas. Además, la unidad DÍAS se puede utilizar y se trata exactamente igual a 24 horas.
from(), of(), ofDays(),ofHours(),ofMillis(), ofMinutes(), ofNanos(), ofSeconds()
public static Duration from(TemporalAmount amount)
public static Duration of(long amount, TemporalUnit unit)
public static Duration ofDays(long days)
public static Duration ofHours(long hours)
public static Duration ofMillis(long millis)
public static Duration ofMinutes(long minutes)
public static Duration ofNanos(long nanos)
public static Duration ofSeconds(long seconds)
public static Duration ofSeconds(long seconds, long nanoAdjustment)
Obtiene un objeto Duration con el valor indicado en el Temporal o según la función utilizada
El caso especial es la funcion from que crea el objeto copiando el anterior, en el ejemplo vemos como se crean estos objetos
public static void main(String[] args) {
// Obtener Duration desde numero de dias
Duration ej = Duration.ofDays(5); // 5 dias
Duration ddias = Duration.from(ej); // lo mismo que ej
Duration unDia = Duration.of(24, ChronoUnit.HOURS);
System.out.println(ej);
System.out.println(ddias);
System.out.println(unDia);
}
Lo que nos aparecerá en la consola son las representaciones string de esas duraciones
getUnits()
public List<TemporalUnit> getUnits()
Nos obtiene la lista de unidades compatibles con este Duration
En el ejemplo, vemos que solo podemos trabajas con segundos y con nanosegundos
public static void main(String[] args) {
Duration ej = Duration.ofDays(5);
List<TemporalUnit> a = ej.getUnits();
a.forEach(valor -> {
System.out.println((valor + " ").substring(0,10)
+ " \t-" + valor.getDuration());
});
}
En la consola, nos aparecerá la lista
addTo(), subtractFrom()
public Temporal addTo(Temporal temporal)
public Temporal subtractFrom(Temporal temporal)
Obtiene un Temporal que representa el valor del Duration, despues de sumar o restar un temporal dado
En ejemplo expuesto, se consigue la hora actual y se calcula la hora que era 3 horas antes y tres horas después, utilizando un objeto Duration con ese valor.
public static void main(String[] args) {
LocalTime now = LocalTime.now();
Duration h1 = Duration.ofHours(3);
LocalTime antes = (LocalTime)h1.subtractFrom(now);
LocalTime despues = (LocalTime)h1.addTo(now);
System.out.println("Ahora :" + now);
System.out.println("Antes :" + antes);
System.out.println("Despues:" + despues);
}
Los calores que apareceran en consola son:
between()
public static Duration between(Temporal startInclusive, Temporal endExclusive)
Obtiene la duración o distancia de tiempo que existe entre los dos temporales
En el ejemplo, queremos calcular las horas transcurridas del dia, con lo cual, establecemos la distancia entre LocalTime.MIN que representa 00:00:00 y la hora actual
public static void main(String[] args) {
LocalTime ini = LocalTime.MIN;
LocalTime now = LocalTime.now();
Duration d1 = Duration.between(ini, now);
System.out.println(d1);
}
El resultado que aparece en consola, dependiendo el momento en que se haga esta prueba, es
compareTo()
public int compareTo(Duration otherDuration)
Compara dos duraciones de tiempo
En este ejemplo, hemos utilizado el compare para determinar si estamos en la mañana (antes de las 12:00) o en la tarde. Si, hay otras formas, pero queríamos ver como funciona el compareTo, luego establecemos las duraciones desde las 00:00 hasta el momento actual, y entre el momento actual y las 24
La comparación dará -1, por la mañana, 0 al mediodía, y 1 por la tarde
public static void main(String[] args) {
LocalTime ini = LocalTime.MIN;
LocalTime now = LocalTime.now();
LocalTime fin = LocalTime.MAX;
Duration di = Duration.between(ini, now);
Duration df = Duration.between(now, fin);
int c = di.compareTo(df);
System.out.println(di);
System.out.println(df);
System.out.println(c);
}
Los resultados, dependen de la hora del dia; a mi me ha dado:
divideBy(), multiplyBy
public Duration dividedBy(long divisor)
public Duration multipliedBy(long multiplicand)
Devuelve una copia de la duración, dividida o multiplicada por el valor indicado
En el ejemplo, hemos obtenido un Duration de 12 horas, en base a ese, hemos conseguido el de 6 horas y el de 24 horas, multiplicándolo y dividiéndolo por 2
public static void main(String[] args) {
Duration base = Duration.ofHours(12);
Duration mitad = base.dividedBy(2);
Duration doble = base.multipliedBy(2);
System.out.println("Base :" + base);
System.out.println("Mitad:" + mitad);
System.out.println("Doble:" + doble);
}
La salida que tenemos es:
equals()
public boolean equals(Object otherDuration)
Compara dos tiempos, para ver si son iguales
En este caso calculo las distancias a inicio y fin del dia, y las comparo por igual. El true solo lo conseguiré a las 12:00, pero… también se puede hacer así.
public static void main(String[] args) {
LocalTime ini = LocalTime.MIN;
LocalTime now = LocalTime.now();
LocalTime fin = LocalTime.MAX;
Duration di = Duration.between(ini, now);
Duration df = Duration.between(now, fin);
boolean c = di.equals(df);
System.out.println(di);
System.out.println(df);
System.out.println(c);
}
Y, el resultado previsto es:
get(), getNano(), getSeconds()
public long get(TemporalUnit unit)
Obtiene el valor en la unidad indicada
public int getNano()
Obtiene la duración en nanosegundos
public long getSeconds()
Obtiene la duración en segundos
El ejemplo presenta la obtención de la duración de un objeto de varias formas
public static void main(String[] args) {
//Obtener Duration desde numero de dias
Duration ej = Duration.ofHours(1); //1 hora
System.out.println(ej.get(ChronoUnit.SECONDS));
System.out.println(ej.getSeconds());
}
Con la salida
plus(), plusDays(), plusHours(), plusMilis(), plusMinutes(), plusNanos(), plusSeconds()
public Duration plus(Duration duration)
public Duration plus(long amountToAdd, TemporalUnit unit)
public Duration plusDays(long daysToAdd)
public Duration plusHours(long hoursToAdd)
public Duration plusMillis(long millisToAdd)
public Duration plusMinutes(long minutesToAdd)
public Duration plusNanos(long nanosToAdd)
public Duration plusSeconds(long secondsToAdd)
Devuelve una copia de un objeto Duration sumándole al objeto actual la cantidad de tiempo facilitada
En el ejemplo, creamos un objeto Duración de 600 segundos(10 minutos), y vamos sumandoles distintas cantidades, con diferentes módulos.
public static void main(String[] args) {
//Obtener Duration desde numero de dias
Duration ej = Duration.ofMinutes(10); //10 minutos
System.out.println(ej.getSeconds());
Duration mi20 = Duration.ofMinutes(20);
System.out.println(mi20.getSeconds());
Duration mi40 = ej.plus(mi20);
System.out.println(mi40.getSeconds());
Duration mi50 = mi40.plusMinutes(10);
System.out.println(mi50.getSeconds());
}
Los resultados en segundos son
minus(), minusDays(), minusHours(), minusMillis(), minusMinutes(), minusNanos(), minusSeconds
public Duration minus(Duration duration)
public Duration minus(long amountToSubtract, TemporalUnit unit)
public Duration minusDays(long daysToSubtract)
public Duration minusHours(long hoursToSubtract)
public Duration minusMillis(long millisToSubtract)
public Duration minusMinutes(long minutesToSubtract)
public Duration minusNanos(long nanosToSubtract)
public Duration minusSeconds(long secondsToSubtract)
Devuelve una copia de un objeto Duration restandole al objeto actual la cantidad de tiempo facilitada
En el ejemplo, creamos un objeto Duración de 3600 segundos(1 hora), y vamos restándole distintas cantidades, con diferentes módulos.
public static void main(String[] args) {
//Obtener Duration desde numero de dias
Duration ej = Duration.ofHours(1); //1 hora
System.out.println(ej.getSeconds());
Duration mi20 = Duration.ofMinutes(20);
System.out.println(mi20.getSeconds());
Duration mi40 = ej.minus(mi20);
System.out.println(mi40.getSeconds());
Duration mi30 = mi40.minusMinutes(10);
System.out.println(mi30.getSeconds());
}
Los resultados, siempre en segundos que es como se pidieron son:
parse()
public static Duration parse(CharSequence text)
Obtiene un objeto Duration, son la cantidad de tiempo facilitada en una string, con el formato PnDTnHnMn.nS
El formato de la cadena que se analizará es «PnDTnHnMn.nS», donde «nD» significa «n» número de días, «nH» significa «n» número de horas, «nM» significa «n» número de minutos, «nS» ” significa ‘n’ número de Segundos y “T” es un prefijo que debe usarse antes de la parte que consiste en “nHnMn.nS”.
En el ejemplo, cargamos el Duration con 2 dias
public static void main(String[] args) {
Duration d1 = Duration.parse("P2D");
System.out.println(d1);
}
Y en pantalla nos presenta la duración, aunque nos la dará en horas
toString()
public String toString()
Convierte el objeto Duration a string, utilizando el formato PT8H6M12.345S.
Los ejemplos de este método han sido mostrados a lo largo de toda la pagina.
toDays(), toHours(), toMillis(), toMinutes(), toNanos()
public long toDays()
public long toHours()
public long toMillis()
public long toMinutes()
public long toNanos()
Obtiene el valor del Duration en dias, horas, milisegundos o nanosegundos
El ejemplo queda autodefinido
public static void main(String[] args) {
Duration d1 = Duration.ofDays(1);
System.out.println("En dias :" + d1.toDays());
System.out.println("En minutos:" + d1.toMinutes());
}
y la salida será
withNanos(), withSeconds()
public Duration withNanos(int nanoOfSecond)
public Duration withSeconds(long seconds)
Devuelve una copia del objeto Duration, con el tiempo especificado en segundos o nanosegundos
En el ejemplo, se crea un objeto Duration, que a continuación se abandona, cambiando su valor.
public static void main(String[] args) {
Duration d1 = Duration.ofDays(1);
d1 = d1.withSeconds(30);
System.out.println("En dias :" + d1.toDays());
System.out.println("En minutos :" + d1.toMinutes());
System.out.println("En Segundos:" + d1.toMillis()/1000);
}
y su salida, en donde hemos tenido que obtener segundos desde las milésimas….
Conclusión
La clase Duration, nos permite almacenar cantidad de tiempo, y las operaciones necesarias para aumentar o disminuir dicho intervalo. Este objeto se puede usar posteriormente para cambiar clocks
Este articulo detalle una de las clases de la api java.time descritas anteriormente en el indice que se facilitó sobre este tema
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.