とある技術者の備忘録的情報

Java8での日時の扱い方

  • このエントリーをはてなブックマークに追加

Javaでも何でもプログラミングをしていて、日時を扱う機会は非常に多いですよね。

日時を取得したり、足したり引いたり(日時の計算)、表示フォーマットを変えたり、文字列にしたりと。

なので、それぞれのやり方についてまとまっていると、非常に便利なので備忘録として記録しときます。

 

ちなみに、少し話がずれますが、私は、これまでVBAやFortranや、C、C++、等々色々とやってきましたが、Javaはあまり扱ってきませんでした。

それが最近、JForexというJavaでプログラムを組むことで外貨取引(FX)の自動売買できるサービスがあり、それを始めたのがきっかでJavaの勉強も始めました。

Javaを使ってJForexでのFX自動売買については、別個でまた記事にしていきたいと思います。

※JForexとは、スイスのジュネーブに本部を置くDukascopy Bank SA(デューカスコピー銀行)が提供しているFXサービスです。(https://www.dukascopy.jp/home/

今回の記事は、FXの自動売買となると、やはり日時の扱いが多く、日時の扱い方について備忘録として記録したものです。

 

Java8での日時に関するクラス

  • Instant – 日時(UNIX時間/エポック時)
  • LocalDateTime – タイムゾーンなしのローカル日時
  • ZonedDateTime – タイムゾーンありの日時

 

★Instantの使い方★

——————————————————–

// 現在日時
Instant nowInstant = Instant.now();

// long型をInstantに
Instant instant_long = Instant.ofEpochMilli(msec1);

// LocalDateTimeをInstantに
Instant instant_LDT = localDt1.toInstant(ZoneId.systemDefault().getRules().getOffset(Instant.EPOCH));

// ZonedDateTimeをInstantに
Instant instant_zone1 = zonedDt1.toInstant();
Instant instant_zone2 = Instant.from(zonedDt1);

// 文字列をInstantに
Instant instant5 = Instant.parse("2011-12-08T10:15:30.00Z");

// Instantを文字列に
String instantStr1 = DateTimeFormatter.ISO_INSTANT.format(instant_time);
String instantStr2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS")
        .format(LocalDateTime.ofInstant(instant1, ZoneId.systemDefault()));

// 日時から日付・時刻を取り出す(Instant)
Instant ymdInstant1 = instant1.truncatedTo(ChronoUnit.DAYS);

// 曜日の取り出す(Instant)
String instantWeek1 = DateTimeFormatter.ofPattern("E, EEEE", Locale.JAPANESE)
        .format(LocalDateTime.ofInstant(instant1, ZoneId.systemDefault()));
String instantWeek2 = LocalDateTime.ofInstant(instant1, ZoneId.systemDefault()).getDayOfWeek()
        .getDisplayName(TextStyle.FULL, Locale.JAPANESE);

 

★LocalDateTimeの使い方★

——————————————————–

// 現在日時
LocalDateTime nowLocalDt = LocalDateTime.now();

// 指定日時
LocalDateTime localDt2 = LocalDateTime.of(2016, 12, 8, 15, 10, 0);

// long型からLocalDateTimeに
LocalDateTime localDt3 = LocalDateTime.ofInstant(Instant.ofEpochMilli(msec1), ZoneId.systemDefault());

// InstantタイプからLocalDateTimeに
LocalDateTime localDt4 = LocalDateTime.ofInstant(instant1, ZoneId.systemDefault());

// ZonedDateTimeからLocalDateTimeに
LocalDateTime localDt5a = zonedDt1.toLocalDateTime();
LocalDateTime localDt5b = LocalDateTime.from(zonedDt1);

// 文字列からLocalDateTimeに
LocalDateTime localDt6a = LocalDateTime.parse("2011-12-08T12:15:30.123");
LocalDateTime localDt6b = LocalDateTime.parse("2011/12/08 12:15:30.123",
        DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS"));

// LocalDateTimeを文字列に
String localStr1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS").format(localDt1);

// LocalDateTimeの日時から日付・時刻を取り出す
LocalDate localDate1 = localDt1.toLocalDate();
LocalTime localTime1 = localDt1.toLocalTime();

// LocalDateTimeから曜日を取り出す
// ※"E","EEEE"は、タイムゾーンによって曜日の表記が変わる
String localWeek1 = DateTimeFormatter.ofPattern("E, EEEE", Locale.JAPANESE).format(localDt1);
String localWeek2 = localDt1.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.JAPANESE);

// 日時の加算・減算
// LocalDateTimeの1秒後、1日後、1ヶ月後をだす
LocalDateTime localNextSec = localDt1.plusSeconds(1);
LocalDateTime localNextDay = localDt1.plusDays(1);
LocalDateTime localNextMonth = localDt1.plusMonths(1);

// LocalDateTimeの1秒前、1日前、1ヶ月前をだす
LocalDateTime localPrevSec = localDt1.minusSeconds(1);
LocalDateTime localPrevDay = localDt1.minusDays(1);
LocalDateTime localPrevMonth = localDt1.minusMonths(1);

// LocalDateTimeの月末・月初
LocalDateTime localMonthEnd = localDt1.with(TemporalAdjusters.lastDayOfMonth());
LocalDateTime localMonthBegin = localDt1.with(TemporalAdjusters.firstDayOfMonth());

 

★ZonedDateTimeの使い方★

——————————————————–

// 現在日時
ZonedDateTime nowZonedDt = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));

// 指定日時
ZonedDateTime zonedDt2 = ZonedDateTime.of(2011, 12, 8, 15, 10, 0, 0, ZoneId.of("Asia/Tokyo"));

// long型からZonedDateTimeに
ZonedDateTime zonedDt3 = ZonedDateTime.ofInstant(Instant.ofEpochMilli(msec1), ZoneId.systemDefault());

// InstantタイプからZonedDateTimeに
ZonedDateTime zonedDt4a = instant1.atZone(ZoneId.systemDefault());
ZonedDateTime zonedDt4b = ZonedDateTime.ofInstant(instant1, ZoneId.systemDefault());

// LocalDateTimeタイプをZonedDateTimeに
ZonedDateTime zonedDt5a = localDt1.atZone(ZoneId.systemDefault());
ZonedDateTime zonedDt5b = ZonedDateTime.ofLocal(localDt1, ZoneId.systemDefault(), null);

// 文字列をZonedDateTime型に
ZonedDateTime zonedDt6a = ZonedDateTime.parse("2011-12-08T15:15:30+01:00[Europe/Paris]");
ZonedDateTime zonedDt6b = ZonedDateTime.parse("2011/12/08 15:15:30 Asia/Tokyo",
        DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss VV"));
ZonedDateTime zonedDt6c = ZonedDateTime.parse("2016/05/02 10:15:30 JST",
        DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss zzz"));

// ZonedDateTimeを文字列に
// ゾーンを表示するための指定が加わる
// "xxxxx VV" - (表示例)"+12:00 Asia/Tokyo"
// "xxxx zzz" - (表示例)"+1200 JST"  ※JSTは日本標準時で、UTC+9時間
String zonedStr1a = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSSxxxxx VV").format(zonedDt1);
String zonedStr1b = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSSxxxx zzz").format(zonedDt1);

// ZonedDateTimeの日時から日付・時刻を取り出す
ZonedDateTime ymdZoned1 = zonedDt1.truncatedTo(ChronoUnit.DAYS);
LocalDate localDate2 = zonedDt1.toLocalDate();
LocalTime localTime2 = zonedDt1.toLocalTime();

// ZonedDateTimeから曜日を取り出す
// ※"E","EEEE"は、タイムゾーンによって曜日の表記が変わる。
String zonedWeek1 = DateTimeFormatter.ofPattern("E, EEEE", Locale.JAPANESE).format(zonedDt1);
String zonedWeek2 = zonedDt1.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.JAPANESE);

// ZonedDateTimeの1秒後、1日後、1ヶ月後をだす
ZonedDateTime zonedNextSec = zonedDt1.plusSeconds(1);
ZonedDateTime zonedNextDay = zonedDt1.plusDays(1);
ZonedDateTime zonedNextMonth = zonedDt1.plusMonths(1);

// ZonedDateTimeの1秒前、1日前、1ヶ月前をだす
ZonedDateTime zonedPrevSec = zonedDt1.minusSeconds(1);
ZonedDateTime zonedPrevDay = zonedDt1.minusDays(1);
ZonedDateTime zonedPrevMonth = zonedDt1.minusMonths(1);

// ZonedDateTimeの月末・月初
ZonedDateTime zonedMonthEnd = zonedDt1.with(TemporalAdjusters.lastDayOfMonth());
ZonedDateTime zonedMonthBegin = zonedDt1.with(TemporalAdjusters.firstDayOfMonth());

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

スポンサードリンク