Java 基本的なAPIクラスの使い方

Javaでは、あらかじめ便利なAPIクラスが使えるようになっています。基本的には、import宣言で読み込む形でAPIの利用ができます。

⇩  APIクラスの情報は下記サイトで調べられます(バージョン8の例)

Java Platform SE 8

f:id:ts0818:20170708194625j:plain

Dateクラス

継承関係

日付の計算などが必要ない場合は、Dateクラスを使うのが良いようです。

の2種類のAPIがありますが、Java.util.Dateを使っていきます。

package chap14;

import java.util.Date;

public class DateSample {

  public static void main(String[] args) {

    // 現在日時の取得
    Date now = new Date();
    System.out.println(now);
    // long値として取得
    System.out.println(now.getTime());
    // long値を指定して日時を特定
    Date past = new Date(1499389966046L);
    System.out.println(past);
  }
}

 

Calendarクラス

継承関係

日付の計算などを行う場合には、Calendarクラスが良いようです。

package chap14;

import java.util.Calendar;
import java.util.Date;

public class CalendarSample {

  public static void main(String[] args) {
    
    String[] week = {"日","月","火","水","木","金","土"};

    // 現在の年を表示する
//    Date now = new Date();
    Calendar c = Calendar.getInstance();
//    c.setTime(now);
    int y = c.get(Calendar.YEAR); // 年の取得
    int m = c.get(Calendar.MONTH) + 1; // 月の取得
    System.out.println("現在は" +y + "年" + m + "月"); 
    
    // 取得したい日時情報をint値として取得する
    System.out.println(c.get(Calendar.YEAR) + "年" + 
                                  (c.get(Calendar.MONTH) + 1)  + "月" + 
                                   c.get(Calendar.DAY_OF_MONTH)  + "日" + 
                                   c.get(Calendar.HOUR_OF_DAY)  + "時" + 
                                   c.get(Calendar.MINUTE)  + "分"   +
                                   c.get(Calendar.SECOND)  + "秒   "  +
                                   week[c.get(Calendar.DAY_OF_WEEK) - 1] + "曜日");
    
    // 指定した日のDate型の値を得る
    c.set(2010, 8, 22, 1, 23, 45); // Calendarに日時を設定する
    c.set(Calendar.YEAR, 2011);  // 年だけを2011年に変更
    Date past = c.getTime();        // Date型に変換
    System.out.println(past);

  }
}

 

SimpleDateFormatクラス

継承関係

  • java.lang.Object
    • java.text.Format
      • java.text.DateFormat
        • java.text.SimpleDateFormat

 

package chap14;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatSample {

  public static void  main(String[] args) throws ParseException {

    // 本日の日時を表示する
    Date now = new Date();
    
    SimpleDateFormat f = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); // 出力フォーマットの指定
    String s = f.format(now);
    System.out.println(s);
    
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E曜日 HH時mm分ss秒"); // 出力フォーマットの指定
    String s1 = sdf.format(now);
    System.out.println(s1);
    
    // 指定日時の文字列を解析しDate型として得る
    Date d = f.parse("2011/09/22 01:23:55");
    System.out.println(d);
    System.out.println(f.format(d));
  }
}

日付の出力形式を変更できます。

Java 8で追加されたJava.timeパッケージ

ネットでは、Date-Time API と呼ばれたりしてるようです。

ここが大変だよJava 8 Date-Time API(1):ImmutableでスレッドセーフになったJavaの新しい日時APIの基礎知識 (1/5) - @IT

Java.timeパッケージが導入されるまでは、Date Calendar SimpleDateFormat などのクラスを使っていたようですが、これからは、Java.timeパッケージを利用していく流れになるようです。

  • 時差を扱わないのならば、Localで始まるクラスを使う
  • 時差を扱うのならば、Offsetで始まるクラスを使う
  • 時差に加えて、その地域の日時が考慮されている方が望ましい場合はZoneDateTimeクラスを使う
  • Stringクラスと同様、イミュータブルでスレッドセーフなクラスになった
  • これまでミリ秒までしか扱えなかったのが、ナノ秒まで扱えるようになった

 

java.timeパッケージのLocaleDateクラス

LocaleDateクラス

継承関係

 

package api;

import java.time.LocalDate;

public class LocalDateSample {

  public static void main(String[] args) {
    // 時差を持たない日時
    LocalDate today      = LocalDate.now();
    int year             = today.getYear();
    int month            = today.getMonthValue();
    int day              = today.getDayOfMonth();

    LocalDate future_day = today.plusDays(5);
    LocalDate past_day   = today.minusDays(5);

    if(today.isBefore(future_day)) {
      System.out.println("today < future_day");
    }

    if(today.isAfter(past_day)) {
      System.out.println("past_day < today");
    }

    if(today.isEqual(today)) {
      System.out.println("today = today");
    }

    System.out.println(today);
    System.out.println(year + "年" + month + "月" + day + "日");
    System.out.println(future_day);
    System.out.println(past_day);

  }
}

 

java.timeパッケージの列挙型DayOfWeek

列挙型DayOfWeek

継承関係

LocaleDateクラスのメソッドで、曜日も取得できるのですが、曜日用の変数を用意してあげないといけないようで、それがDayOfWeekクラスです。

package api;

import java.time.DayOfWeek;
import java.time.LocalDate;

public class DayOfWeekSample {

  public static void main(String[] args) {
    // 時差を持たない日時
    LocalDate today = LocalDate.now();
    int year        = today.getYear();
    int month       = today.getMonthValue();
    int day         = today.getDayOfMonth();

    // 曜日
    DayOfWeek dayWeek = today.getDayOfWeek();

    System.out.println(today);
    System.out.println(year + "年" + month + "月" + day + "日" + dayWeek);

  }
}

このままだと、曜日が英語になってしまっているので日本語に変換したいところです。

java.time.formatパッケージの列挙型TextStyle、Java.util.Locale

列挙型TextStyle

継承関係

Localeクラス

継承関係

package api;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.TextStyle;
import java.util.Locale;

public class DayOfWeekSample {

  public static void main(String[] args) {
    // 時差を持たない日時
    LocalDate today = LocalDate.now();
    int year        = today.getYear();
    int month       = today.getMonthValue();
    int day         = today.getDayOfMonth();

    // 曜日
    DayOfWeek dayWeek  = today.getDayOfWeek();
    String str_dayWeek = dayWeek.getDisplayName(TextStyle.FULL, Locale.JAPAN);
    System.out.println(today);
    System.out.println(year + "年" + month + "月" + day + "日" + str_dayWeek);

  }
}
   

java.time.formatパッケージの列挙型TextStyleとJava.utilパッケージのLocaleクラスが必要です。

LocalTimeクラス

継承関係

package api;

import java.time.LocalTime;

public class LocalTimeSample {

  public static void main(String[] args) {
    int hour    = 7;
    int minutes = 15;
    int seconds = 30;
    // 時刻を作成
    LocalTime time = LocalTime.of(hour, minutes, seconds);
    System.out.println(time);
  }

}

メソッドなどはLocalDateとほとんど同じ感じですかね。

LocalDateTimeクラス

LocalDateTimeクラス

継承関係

  • java.lang.Object
    • java.time.LocalDateTime
package api;

import java.time.LocalDateTime;


public class LocalDateTimeSample {

  public static void main(String[] args) {
    int year         = 2017;
    int month        = 07;
    int dayOfMonth   = 9;
    int hour         = 7;
    int minute       = 15;
    int second       = 30;
    int nanoOfSecond = 000000001;
    // 時刻を作成
    LocalDateTime dateTime = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
    System.out.println(dateTime);
  }

}

メソッドなどはLocalDateとほとんど同じ感じですかね。

Durationクラス

LocalDateTimeクラス

継承関係

package api;

import java.time.Duration;
import java.time.LocalDateTime;


public class DurationSample {

  public static void main(String[] args) {
    int year         = 2017;
    int month        = 07;
    int dayOfMonth   = 9;
    int hour         = 7;
    int minute       = 15;
    int second       = 30;
    int nanoOfSecond = 000000001;
    // 時刻を作成
    LocalDateTime startInclusive = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
    LocalDateTime endExclusive   = LocalDateTime.of(year + 1, month + 1, dayOfMonth + 1, hour + 1, minute, second + 1, nanoOfSecond + 1);
    
    Duration duration = Duration.between(startInclusive, endExclusive);
    
    System.out.println("ミリ秒からナノ秒の差:" + duration.getNano());
    System.out.println("積算日数の差:" + duration.toDays());
    System.out.println("積算時間の差:" + duration.toHours());
    System.out.println("積算分数の差:" + duration.toMinutes());
    System.out.println("積算秒数の差:" + duration.getSeconds());
    System.out.println("積算ミリ秒の差:" + duration.toMillis());
    System.out.println("積算ナノ秒の差:" + duration.toNanos());

  }

}

時刻の間隔を扱うようです。

Periodクラス

継承関係

package api;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;


public class PeriodSample {

  public static void main(String[] args) {
    int year         = 2017;
    int month        = 07;
    int dayOfMonth   = 9;
    int hour         = 7;
    int minute       = 15;
    int second       = 30;
    int nanoOfSecond = 000000001;
    // 時刻を作成
    LocalDateTime localDateStart = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
    LocalDateTime localDateEnd   = LocalDateTime.of(year + 1, month + 1, dayOfMonth + 1, hour + 1, minute, second + 1, nanoOfSecond + 1);
    
    LocalDate startDateInclusive = localDateStart.toLocalDate();
    LocalDate endDateExclusive   = localDateEnd.toLocalDate();
    
    Period period = Period.between(startDateInclusive, endDateExclusive);
    
    System.out.println("年数の差:" + period.getYears());
    System.out.println("月数の差:" + period.getMonths());
    System.out.println("日数の差:" + period.getDays());
    
    System.out.println("積算月数の差:" + period.toTotalMonths());

  }

}

日付の間隔を扱うようです。

Date Time APIとDate / Calendar の相互変換

java.time.instantクラスというものを使うことで、DateクラスやCalendarクラスで記述されていたものを書き換えることができるみたいです。

package api;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.Calendar;
import java.util.Date;

public class TimeInstaceSample {

  public static void main(String[] args) {
    //
    Date date   = new Date();
    Calendar cl = Calendar.getInstance();

    int year   = 2017;
    int month  = Month.JULY.getValue();
    int day    = Calendar.DAY_OF_MONTH;
    int hour   = Calendar.HOUR;
    int minute = Calendar.MINUTE;
    int second = Calendar.SECOND;
    int mills  = Calendar.MILLISECOND;
    int nano   = 567890123;

    LocalDateTime localDateTime = LocalDateTime.of(year, month, day, hour, minute, second, nano);
    Instant instant = localDateTime.toInstant(ZoneOffset.of("+09:00"));
    System.out.println(localDateTime);
    
    // Instant → Date 変換
    Date date2 = Date.from(instant);
    System.out.println(date2);

    // Date → Instant 変換
    Instant instant2 = date.toInstant();
    LocalDateTime localDateTime2 = LocalDateTime.ofInstant(instant2, ZoneId.of("Asia/Tokyo"));
    System.out.println(instant2);
    System.out.println(localDateTime2);


    // Calendar → Instant
    Instant instant3 = cl.toInstant();
    LocalDateTime localDateTime3 = LocalDateTime.ofInstant(instant3, ZoneId.of("Asia/Tokyo"));
    System.out.println(instant3);
    System.out.println(localDateTime3);


  }

}

ただし、DateやCalendarクラスではミリ秒までしか扱えないので、Date-Time APIのクラスから、Date / Calendar クラスに変換するとデータの切り捨てが発生するようです。