Skip to content

Instantly share code, notes, and snippets.

@kariyayo
Last active October 27, 2017 09:39
Show Gist options
  • Save kariyayo/9a23d101bc0edb035990 to your computer and use it in GitHub Desktop.
Save kariyayo/9a23d101bc0edb035990 to your computer and use it in GitHub Desktop.
java.timeパッケージのメモ
/**
* InstantとDuration
*/
// java.time.Instant はエポックを起点とし、1日を86400秒として計測されたある時点を表す
Instant base = Instant.now(); // 2015-03-03T08:05:41.758Z
Instant after = base.plusSeconds(10).plusMillis(100).minusMillis(10); // 2015-03-03T08:05:51.848Z
Instant.now().getEpochSecond(); // 1451088582L
// java.time.Duration は2つのInstantの間隔
Duration duration = Duration.between(base, after); //PT10.09S
duration.toMillis(); // 10090
duration.isZero(); // false
duration.isNegative(); //false
duration.plusMillis(10).multipliedBy(100).dividedBy(10).negated().toMillis(); // -101000
/**
* LocalDateとLocalTimeとPeriod
*/
// java.time.LocalDate はゾーン情報を持っていない日付を表す。時刻ももっていない。誕生日や予定を表現するのに便利。
LocalDate.now();
LocalDate.of(2015, 1, 5); // 月は0ではなく、1から始まる
LocalDate.of(2015, Month.JANUARY, 1);
LocalDate.of(2015, 1, 5).minusYears(1).plusMonths(2).plusDays(10).plusWeeks(1); // 2014-03-22
LocalDate.of(2015, 1, 5).withDayOfMonth(21); // 2015-01-21
LocalDate.of(2015, 1, 5).getDayOfMonth(); // 5
LocalDate.of(2015, 1, 5).getDayOfYear(); // 5
LocalDate.of(2015, 1, 5).getDayOfWeek(); // MONDAY
LocalDate.of(2015, 1, 5).isBefore(LocalDate.of(2015, 2, 10)); // true
LocalDate.of(2015, 1, 5).isLeapYear(); // false
// java.time.Period は2つのLocalDateの間隔を表す。ただ、月と日が別々にしかとれない?
Period period = LocalDate.of(2015, 1, 5).until(LocalDate.of(2015, 3, 11)); // P2M6D
period.get(ChronoUnit.MONTHS); // 2
period.get(ChronoUnit.DAYS); // 6
// こうすると65日間という値が取れる。こっちの方が使いそう
LocalDate.of(2015, 1, 6).until(LocalDate.of(2015, 3, 11), ChronoUnit.DAYS); // 65
// 翌週の火曜日
LocalDate.of(2015, 1, 6).with(TemporalAdjusters.next(DayOfWeek.TUESDAY)); // 2015-01-13
// 同じ週、もしくは、翌週の火曜日
LocalDate.of(2015, 1, 6).with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY)); // 2015-01-06
// 前週の月曜日
LocalDate.of(2015, 1, 6).with(TemporalAdjusters.previous(DayOfWeek.MONDAY)); // 2015-01-05
// 弟2土曜日
LocalDate.of(2015, 1, 6).with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.SATURDAY)); // 2015-01-10
// 最終日曜日
LocalDate.of(2015, 1, 6).with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY)); // 2015-01-25
// 最終日
LocalDate.of(2015, 1, 6).with(TemporalAdjusters.lastDayOfMonth()); // 2015-01-31
// java.time.LocalTimeは、1日のある時刻を表す
LocalTime.now();
LocalTime.of(21, 20);
LocalTime.of(21, 20).plusHours(3).plusMinutes(20).plusSeconds(10); // 00:40:10
LocalTime.of(21, 20).withMinute(50); // 21:50
LocalTime.of(21, 20).getHour(); // 21
LocalTime.of(21, 20).isAfter(LocalTime.of(3, 1)); // true
// 00:00 からの経過秒数
LocalTime.of(21, 20).toSecondOfDay(); // 76800
/**
* ZonedDateTime
*/
// java.time.ZonedDateTime はタイムゾーン付きの日時を表す
ZonedDateTime.now(); // 2015-03-04T16:54:00.422+09:00[Asia/Tokyo]
ZonedDateTime.now(ZoneId.of("Europe/Moscow")); // 2015-03-04T11:54:00.424+04:00[Europe/Moscow]
ZonedDateTime.ofInstant(Instant.now(), ZoneId.of("Asia/Tokyo")); // 2015-03-04T16:57:19.539+09:00[Asia/Tokyo]
ZonedDateTime.of(2015, 1, 6, 21, 30, 0, 0, ZoneId.of("Asia/Tokyo")); // 2015-01-06T21:30+09:00[Asia/Tokyo]
ZonedDateTime.of(LocalDate.of(2015, 1, 6), LocalTime.of(21, 30), ZoneId.of("Asia/Tokyo")); // 2015-01-06T21:30+09:00[Asia/Tokyo]
ZonedDateTime dateTime = ZonedDateTime.of(2015, 2, 6, 21, 30, 0, 0, ZoneId.of("Asia/Tokyo"));
dateTime.minusYears(1).plusMonths(2).plusDays(5).minusHours(1).minusMinutes(10); // 2014-04-11T20:20+09:00[Asia/Tokyo]
dateTime.withYear(2013).withHour(0).withMinute(0).withSecond(0).withNano(0); // 2013-02-06T00:00+09:00[Asia/Tokyo]
dateTime.withZoneSameInstant(ZoneId.of("Europe/Moscow")); // 2015-02-06T16:30+04:00[Europe/Moscow]
dateTime.withZoneSameLocal(ZoneId.of("Europe/Moscow")); // 2015-02-06T21:30+04:00[Europe/Moscow]
dateTime.getDayOfYear(); // 37
dateTime.getDayOfMonth(); // 6
dateTime.getDayOfWeek(); // TUESDAY
dateTime.getMonth(); // JANUARY
dateTime.getOffset(); // +9:00
dateTime.isBefore(dateTime.plusHours(10)); // true
/**
* 文字列への変換
*/
// java.time.DateTimeFormatterを使って文字列へ変換する
DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(dateTime); // 2015-02-06T21:30:00+09:00
DateTimeFormatter.ISO_DATE_TIME.format(dateTime); // 2015-02-06T21:30:00+09:00[Asia/Tokyo]
DateTimeFormatter.ISO_INSTANT.format(dateTime); // 2015-02-06T12:30:00Z
DateTimeFormatter.ofPattern("yyyy/MM/dd").format(dateTime); // 2015/02/06
/**
* 文字列からの変換
*/
LocalDate.parse("2015/03/03", DateTimeFormatter.ofPattern("yyyy/MM/dd")); // 2015-03-03
LocalDate.parse("2015/03/03", DateTimeFormatter.ofPattern("yyyy/MM/dd")).withResolverStyle(ResolverStyle.STRICT)); // 実行時エラー
LocalDate.parse("2015/03/03", DateTimeFormatter.ofPattern("uuuu/MM/dd")).withResolverStyle(ResolverStyle.STRICT)); // 2015-03-03 STRICTの場合は"yyyy"ではなく"uuuu"が正しい
ZonedDateTime.parse("2015-02-06T21:30:00+09:00"); // 2015-02-06T21:30+09:00
/**
* java.util.Dateとの変換
*/
Date date = Date.from(Instant.now());
Instant instant = new Date().toInstant();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment