Java 8 における時間の扱い方 (java.time)
[履歴] [最終更新] (2016/06/25 18:55:24)

新規作成

import java.time.LocalDateTime;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.Clock;
import java.time.Instant;

class Main {
    public static void main(String args[]) {

        //// タイムゾーンという概念をもたないクラスの新規作成

        // OS の時間が YYYY/mm/dd HH:MM::SS JST ならば
        // YYYY/mm/dd HH:MM::SS (重要: タイムゾーン情報も時差情報もなし) で作成されます。
        LocalDateTime dt = LocalDateTime.now();
        LocalDate date = LocalDate.now();
        LocalTime time = LocalTime.now();

        // 指定して作成
        LocalDateTime dt2 = LocalDateTime.of(9999, 12, 31, 23, 59, 59); // 9999/12/31 12:59:59


        //// タイムゾーンとひもづくクラスの新規作成 (夏時間も考慮されます)

        // OS のタイムゾーンによらず、現在の時刻が YYYY/mm/dd HH:MM::SS ZoneId ならば
        // YYYY/mm/dd HH:MM::SS ZoneId で作成されます。
        ZonedDateTime dt3 = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
        ZonedDateTime dt4 = ZonedDateTime.now(ZoneId.of("UTC"));
        ZonedDateTime dt5 = ZonedDateTime.now(ZoneId.systemDefault());

        // 指定して作成
        ZonedDateTime dt6 = ZonedDateTime.of(9999, 12, 31, 23, 59, 59, 0, ZoneId.of("UTC"));
        ZonedDateTime dt7 = ZonedDateTime.of(dt, ZoneId.of("UTC"));

        // UNIX タイムスタンプの利用
        Clock clock = Clock.fixed(Instant.ofEpochSecond(1430681351), ZoneId.of("UTC"));
        ZonedDateTime dt8 = ZonedDateTime.now(clock);


        //// タイムゾーンではなく UTC との時差情報をもつクラスの新規作成

        // OS のタイムゾーンによらず、現在の時刻が YYYY/mm/dd HH:MM::SS +X ならば
        // YYYY/mm/dd HH:MM::SS +X で作成されます。
        OffsetDateTime dt9 = OffsetDateTime.now(ZoneOffset.ofHours(+9));
        OffsetDateTime dt10 = OffsetDateTime.now(); // OS の UTC との時差が利用されます

        // 指定して作成
        OffsetDateTime dt11 = OffsetDateTime.of(9999, 12, 31, 23, 59, 59, 0, ZoneOffset.ofHours(+9));
    }
}

基本的な操作

import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.Duration;
import java.time.temporal.TemporalAdjusters;

class Main {
    public static void main(String args[]) {

        ZonedDateTime dt = ZonedDateTime.now(ZoneId.of("UTC"));

        // 文字列に変換
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss zZ");
        System.out.println(dt.format(formatter)); //=> 2016/06/25 08:59:09 UTC+0000

        // 加減算
        Duration duration = Duration.ofHours(10);
        ZonedDateTime dt2 = dt.plus(duration).minus(duration).plus(duration);

        System.out.println(dt2.isEqual(dt)); //=> false
        System.out.println(dt2.isBefore(dt)); //=> false
        System.out.println(dt2.isAfter(dt)); //=> true

        Long epoch = dt.toEpochSecond();
        Long epoch2 = dt2.toEpochSecond();
        System.out.println(epoch2 - epoch); //=> 36000 (= 60 * 60 * 10 secs)

        // 月の最終日を取得
        ZonedDateTime dt3 = dt.with(TemporalAdjusters.lastDayOfMonth());
    }
}
関連ページ