java.time
Habsq tarafından cevap doğru fikri ama yanlış yöntemleri vardır.
Yıllar-aylar-günler ölçeğinde zaman çizelgesine bağlı olmayan bir zaman aralığı için kullanın Period
. Takvim ve saat-dakika-saniye ile ilgisi olmayan 24 saatlik zaman dilimleri anlamına gelen günler için kullanın Duration
. İki ölçeği karıştırmak nadiren mantıklıdır.
Duration
Sınıfı kullanarak UTC'de görüldüğü gibi geçerli anı getirerek başlayın Instant
.
Instant now = Instant.now(); // Capture the current moment as seen in UTC.
Instant then = now.minus( 8L , ChronoUnit.HOURS ).minus( 8L , ChronoUnit.MINUTES ).minus( 8L , ChronoUnit.SECONDS );
Duration d = Duration.between( then , now );
Saat, dakika ve saniye için metin oluşturun.
// Generate text by calling `to…Part` methods.
String output = d.toHoursPart() + " hours ago\n" + d.toMinutesPart() + " minutes ago\n" + d.toSecondsPart() + " seconds ago";
Konsola boşaltın.
System.out.println( "From: " + then + " to: " + now );
System.out.println( output );
Gönderen: 2019-06-04T11: 53: 55.714965Z to: 2019-06-04T20: 02: 03.714965Z
8 saat önce
8 dakika önce
8 saniye önce
Period
Geçerli tarihi alarak başlayın.
Tarih belirlemede saat dilimi çok önemlidir. Herhangi bir an için tarih, dünya genelinde bölgeye göre değişir. Örneğin, Paris'te gece yarısından birkaç dakika sonra Fransa , Montréal Québec'te hala "dün" iken yeni bir gündür .
Saat dilimi belirtilmezse, JVM, geçerli varsayılan saat dilimini örtük olarak uygular. Bu varsayılan çalışma süresi (!) Sırasında herhangi bir anda değişebilir, bu nedenle sonuçlarınız değişebilir. İstediğiniz / beklenen saat dilimini açıkça bir bağımsız değişken olarak belirtmek daha iyidir. Kritikse, bölgeyi kullanıcınızla onaylayın.
Bir belirtme uygun bir zaman dilimi adı biçiminde Continent/Region
gibi America/Montreal
, Africa/Casablanca
ya da Pacific/Auckland
. Hiçbir zaman gibi 2-4 harfli bir kısaltma kullanın EST
veya IST
oldukları gibi değil , gerçek zaman dilimleri, değil standardize ve hatta benzersiz değil (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Sekiz gün, aylar ve yıllar önceki bir tarihi yeniden oluşturun.
LocalDate then = today.minusYears( 8 ).minusMonths( 8 ).minusDays( 7 ); // Notice the 7 days, not 8, because of granularity of months.
Geçen zamanı hesaplayın.
Period p = Period.between( then , today );
"Zaman önce" parçalarının dizisini oluşturun.
String output = p.getDays() + " days ago\n" + p.getMonths() + " months ago\n" + p.getYears() + " years ago";
Konsola boşaltın.
System.out.println( "From: " + then + " to: " + today );
System.out.println( output );
Gönderen: 2010-09-27: 2019-06-04
8 gün önce
8 ay önce
8 yıl önce
Hakkında java.time
Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date
, Calendar
& SimpleDateFormat
.
Daha fazla bilgi edinmek için Oracle Eğitimi'ne bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .
Şu anda bakım modunda olan Joda-Time projesi, java.time sınıflarına geçişi tavsiye ediyor .
Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya üstü ile uyumlu bir JDBC sürücüsü kullanın . Dizelere gerek yok, derslere gerek yok .java.sql.*
Java.time sınıflarını nereden edinebilirim?
ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time uygulamasına gelecekteki olası eklemeler için kanıtlayıcı bir zemindir. Burada bazı yararlı sınıfları gibi bulabilir Interval
, YearWeek
, YearQuarter
, ve daha .