17 Ekim 2019 Perşembe

Duration Sınıfı - 64 bit Saniye + 32 bit Nanosaniye Bilir

Giriş
Şu satırı dahil ederiz 
import java.time.Duration;
Açıklaması şöyle
Quantity of time in terms of seconds and nanoseconds.
C#'taki TimeSpan sınıfına yakındır. Period'dan farklı olarak artık yıl, yaz saati gibi şeyleri hesaba katmaz. Duration sınıfının en küçük çözünürlüğü nanosaniye birimindendir.

Açıklaması şöyle. Yani Duration LocalTime veya LocalDateTime nesnelerini değiştirmek için kullanılır.
Java came with a generic way to handle these date manipulations. It comes up with two objects 
1. Period and 
2. Duration. 
The thumb rule is the same, Period works with LocalDate and Duration will work with LocalTime.
Ne Zaman Duration Elde Ederiz?
İki LocalDateTime, Temporal, Instance farkını alırsak Duration nesnesi elde ederiz.

Örnek - LocalDateTime Çıkartması
Şöyle yaparız.
LocalDateTime startTime = ...
LocalDateTime endTime = ...
Duration totalWaitingDuration = Duration.between(endTime, startTime);
LocalTime ile Farkı
LocalTime gibi 23:59:59 sınırı yoktur. Daha uzun süreleri de saklayabilir. LocalTime ile arasındaki en önemli farklı açıklayan cümle şöyle
LocalDateTime is a Temporal and these represent a point in time, not a duration.

Although "1:30:00" can be interpreted as a point and as a duration, the semantics are different.
* As a point in time: "Half past one in the morning"
* As a duration: "An hour and a half"

One reason this is important is that "25:30:02" is a valid duration, but not a valid time-of-day.
Bu sınıf kendi içinde saniye ve nanosaniye saklar. Açıklaması şöyle.
This class models a quantity or amount of time in terms of seconds and nanoseconds. [...] The range of a duration requires the storage of a number larger than a long. To achieve this, the class stores a long representing seconds and an int representing nanosecond-of-second, which will always be between 0 and 999,999,999.
between metodu
Örnek 1
Şöyle yaparız.
Temporal startInclusive = ...;
Temporal endExclusive = ...;
Duration duration = Duration.between(startInclusive, endExclusive);
Örnek 2
Elimizde iki Instant olsun.
Instant start = ...;
Instant stop = ...;
Şöyle yaparız.
Duration d = Duration.between (start,stop);
get metodu
Açıklaması şöyle.
This returns a value for each of the two supported units, SECONDS and NANOS. All other units throw an exception.
Örnek
Şu kod exception fırlatır.
Duration duration = Duration.ofSeconds(3000);
System.out.println(duration.get(ChronoUnit.MINUTES));
Çıktı olarak şunu alırız.
java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Minutes
    at java.time.Duration.get(Duration.java:537)
getSeconds metodu
Şöyle yaparız.
int seconds = duration.getSeconds();
minus metodu
Şöyle yaparız.
Duration diff = duration.minus(duration2);
of metodu
Örnek
Şöyle yaparız
Duration.ofHours(1);
Duration.ofMinutes(10);
Duration.ofSeconds(23);
Duration.ofMillis(2323);
Duration.ofNanos(45);
Örnek
Şöyle yaparız.
ChronoUnit unit = ...;
Duration duration = Duration.of(1, unit).toNanos();
Örnek
Şöyle yaparız. toString() metodu HMS formatında çıktı verir.
System.out.println(Duration.of(1512431637067L, ChronoUnit.MILLIS));
// output: PT420119H53M57.067S
ofHours metodu
Şöyle yaparız.
Duration compared = Duration.ofHours(8);
ofSeconds metodu
Şöyle yaparız.
Duration duration = Duration.ofSeconds(3000);
parse metodu
Format P ile başlar. T time başladığını gösterir. h saati gösterir.
Örnek
Şu girdi yanlış olduğu için parse edilemez.
"PT10HMS";
Doğru girdi şöyle olmalı
"PT10H0M0S";
Örnek
Şöyle yaparız.
Duration duration = Duration.parse("PT8h");//8 saat
Örnek
Şöyle yaparız. 98 gün 1 saat 23 dakika 45 saniye eder.
Duration.parse("P98DT01H23M45S").toMillis();
Örnek
Şöyle yaparız.
//convert first to a valid Duration representation
String durationStr = input.replaceAll("(\\d+):(\\d+):(\\d+)", "PT$1H$2M$3S");
Duration duration = Duration.parse(durationStr);
int seconds = duration.getSeconds();
plus metodu
Şöyle yaparız.
Duration duration = ...;
Duration duration2 = duration.plus(Duration.ofMinutes(30));
plusMinutes metodu
Şöyle yaparız.
String[] parts = durationAsString.split(":");
Duration duration = Duration
    .ofHours(1)
    .plusMinutes(2)
    .plusSeconds(3);
toHours metodu
Toplam saati döndürür. 25 saat gibi bir değer alabiliriz.
Örnek
Şöyle yaparız.
long hours = duration.toHours();
toMinutes metodu
Toplam dakikayı döndürür. 61 dakika gibi bir değer alabiliriz.
Örnek
Şöyle yaparız.
long minutes = duration.toMinutes();
toNanos metodu
Toplam nanosaniyeyi döndürür.
Şöyle yaparız.
Duration duration = ...;
long conversion = duration.toNanos();
toString metodu
HMS formatında çıktı verir. Şöyle yaparız.
System.out.println(Duration.of(1512431637067L, ChronoUnit.MILLIS));
// output: PT420119H53M57.067S
Diğer
Microsaniyeye Çevirme
toMicros() metodu niyeyse yok.
Şöyle yaparız.
final long microseconds = TimeUnit.NANOSECONDS.toMicros(duration.toNanos())
Duration Formatlama
Java 8 ile Duration nesnesini String'e çevirmek kolay değil.
Örnek
Birimlerin arasını açmak için şöyle yaparız.
public static String humanReadableFormat(Duration duration) {
    return duration.toString()
            .substring(2)
            .replaceAll("(\\d[HMS])(?!$)", "$1 ")
            .toLowerCase();
}
Çıktı olarak şunu alırız.
- 5h
- 7h 15m
- 6h 50m 15s
- 2h 5s
- 0.1s
Örnek
Apache Commons kullanarak H:MM:SS olarak formatlamak için şöyle yaparız.
DurationFormatUtils.formatDuration(totalWaitingDuration.toMillis(), "H:mm:ss", true)
Örnek
H:MM:SS olarak formatlamak için şöyle yaparız.
public static String formatDuration(Duration duration) {
  long seconds = duration.getSeconds();
  long absSeconds = Math.abs(seconds);
  String positive = String.format(
    "%d:%02d:%02d",
    absSeconds / 3600,
    (absSeconds % 3600) / 60,
    absSeconds % 60);
  return seconds < 0 ? "-" + positive : positive;
}
Örnek
Eğer saatin 24'ten fazla olmasını istemezsek şöyle yaparız.
Duration duration = Duration.ofSeconds(3000);
long hours = duration.toHours();
int minutes = (int) ((duration.getSeconds() % (60 * 60)) / 60);
int seconds = (int) (duration.getSeconds() % 60);
System.out.println(hours + ":" + minutes + ":" + seconds);


Hiç yorum yok:

Yorum Gönder