4 Ekim 2018 Perşembe

Duration Sınıfı

Giriş
C#'taki TimeSpan sınıfına yakındır. Period'dan farklı olarak artık yıl, yaz saati gibi şeyleri hesaba katmaz. 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.
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);
toSeconds 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.
//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
Şöyle yaparız.
long hours = duration.toHours();
toMinutes metodu
Şöyle yaparız.
long minutes = duration.toMinutes();
toNanos metodu
Şö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
Duration Formatlama
Java 8 ile Duration nesnesini String'e çevirmek kolay değil.
Ö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