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());
この記事へのコメントはありません。