Java 8における時間APIの初探

4567 ワード

Java 8は現在、大衆の視線に入り始めています。ここで筆者は、Java 8のプレビュー版に、日付と時間に関する新しいAPIが出現することに気づきました。本シリーズの記事では、これらの新しいAPIを例示している。まず本文では、まず以下のいくつかを紹介します。Instant、LocalDate、LocalTime、LocalDateTime。まずインストオブジェクトの使い方を見てみます。
Instant (java.time.Instant)
java.timeカバンの中で一番勉強しやすい内容はInstantという種類です。Instantクラスとは、ある時間(java.util.Dateのような)を表しています。正確にナノ秒までです。ナノ秒を使って時間を表すなら、元々はLongタイプを使うのは足りないです。もっと多くの記憶空間を占用する必要があります。内部は二つのLongフィールドからなります。最初の部分は標準Java計算時代(1970年1月1日から)から現在までの秒数です。第二部分はナノ秒数(永遠に999,999を超えることはありません。999。次の具体例を見ます。
//       
Instant instant = Instant.now();
//  ISO-8601   
System.out.println(instant);
Open JDKで上のコードを実行して、下記のフォーマットの出力があります。2013-06-25 T 16:22:52.96 Zで、より正確な日付を入力しました。以下の例は、Instant類の使用法についてです。
// java.util.Date   Instant 
Instant instant = Instant.ofEpochMilli(new Date().getTime()); 
//         Instant      
instant = Instant.parse("1995-10-23T10:12:35Z");
上記の例では、一つの文字列の中でInstantタイプを作成する時間がありますが、Instantは時間を表しています。タイムゾーンの概念は含まれていませんので、UTCフォーマットに適合した文字列を入力しなければなりません。Instant APIもいくつかの有用な方法を提供し、Instantと他のパケットのクラスを使用していくつかの演算を行うことができます。
instant.plus(Duration.ofHours(5).plusMinutes(4));
以上のコードの意味は、現在の時間に5時間4分を加えるということです。この例では、java.time.Instantの例はいくつ使われていますか?答えは二つです。Java.timeというカバンはスレッドが安全で、他の大部分类と同じで、可変ではありません。Instantもこの規則を遵守していますので、plus()方法は新しい例を作成します。
Instant instant1 = instant.plus(Duration.ofHours(5).plusMinutes(4)); 
System.out.println("Instant is immutable, so instant==instant returns: " + (instant == instant1));
出力は:
Instant is immutable, so instant==instant returns: false
以下はより多くの計算に関する例である。
//  5     
instant.minus(5, ChronoUnit.DAYS); // Option 1   1 
instant.minus(Duration.ofDays(5)); // Option 2    2 
     
//    Instant       
long diffAsMinutes = instant.periodUntil(instant1, ChronoUnit.MINUTES); //   1 
long diffAsMinutes = ChronoUnit.MINUTES.between(instant, instant1); //   2
Instantは比較可能であり、これは2つのInstantを比較できることを意味する。これはisAfter()とisBefore()の2つの方法を提供して比較して、下記のコードで示します。
// compareTo     
System.out.format("instant1.compareTo(instant)=%d.%n", instant1.compareTo(instant)); 
     
//   isAfter() isBefore() 
System.out.format("instant1.isAfter(instant)=%b, instant1.isBefore(instant)=%b.%n",  
instant1.isAfter(instant), instant1.isBefore(instant))
その出力結果は:
instant1.compareTo(instant)=1. 
instant1.isAfter(instant)=true, instant1.isBefore(instant)=false
LocaldateとLocal Time
LocalDateはタイムゾーンがない日付を表しています。例えば1-200です。Local Timeは、タイムゾーンを持たない時間を表しています。例えば、04:44:50.12と、前に述べたInstant類とは1970年からオフセット量を計算しています。この二つの種類の出力は人々が読む日付と時間です。LocalTimeとLocalDateの実例を得るための多くの方法がある。
LocalDate localDate = LocalDate.now(); 
localDate = LocalDate.ofYearDay(2005, 86); //   2005   86  (27-Mar-2005) 
localDate = LocalDate.of(2013, Month.AUGUST, 10); //2013 8 10  
LocalTime localTime = LocalTime.of(22, 33); //10:33 PM 
localTime = LocalTime.now(); 
localTime = LocalTime.ofSecondOfDay(4503); //        4503  (1:15:30 AM)
LocalDateとLocalTimeとInstantは同じスレッド規定を遵守しています。それらのインスタンスは可変ではありません。LocalDateとLocalTimeとInstantは同じ計算と比較方法を持っています。これらの方法はjava.time.temporal.Temporalインターフェースで定義されています。
LocalDate localDate1 = localDate.plus(5, ChronoUnit.HOURS); 
localDate.isBefore(localDate1);
Local DateTime
最後に簡単な日付と時間の種類の中で一番重要なのはLocal Data Teimeです。LocalDateとLocalTimeの組み合わせで、タイムゾーンを持たない日付と時間を表しています。Local DateTimeとInstantは似ているように見えますが、覚えているのは「Instantの中にはタイムゾーンを持たないリアルタイムの時間点があります。ある人は、即時の時間は日付+時間ではないかと言っています。このように見えますが、例えばLocalDateTimeはユーザーにとって簡単な日付と時間の概念でしかないかもしれません。例えば、二人は2013年7月2日11時に生まれて、一人はイギリスで生まれて、二つ目はガーニ福祉アジアです。もし彼らがいつ生まれたのかと聞いたら、彼らは同じ時間に生まれたように見えますが、時間線(例えばグリニッジ時間線)によって詳しく考察すると、生まれた人はイギリスで生まれた人より数時間遅いことが分かります。この他にもLocalDateTimeの使い方は上記で紹介した他の類と似ています。以下の例を示します。
LocalDateTime localDateTime = LocalDateTime.now(); 
//      25  3   
LocalDateTime inTheFuture = localDateTime.plusHours(25).plusMinutes(3); 
//        localTime localDate  
System.out.println(localDateTime.toLocalTime().plusHours(25).plusMinutes(3)); 
System.out.println(localDateTime.toLocalDate().plusMonths(2)); 
//        TemportalAmount   Duration  Period  
System.out.println(localDateTime.toLocalTime().plus(Duration.ofHours(25).plusMinutes(3))); 
System.out.println(localDateTime.toLocalDate().plus(Period.ofMonths(2)));