Java8日期/時間 這篇介紹在Java8時間/日期轉換的方法。 1.以Java 8新的time package為基礎做轉換,效能較佳 2.採用builder設計模式跟lambda組合方式,讓程式更直覺 3.讓String、Date、Calendar、LocalDateTime的相互轉換更有彈性
DateTimeBuilder 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class DateTimeBuilder { @FunctionalInterface public interface DateProcessor { ZonedDateTime process(ZonedDateTime zonedDateTime); } private final ZonedDateTime zonedDateTime; private List<DateProcessor> dateProcessors = null; public static final TemporalField FIRST_DAY_OF_WEEK = WeekFields.of(DayOfWeek.MONDAY, 1).dayOfWeek(); private DateTimeBuilder(ZonedDateTime zonedDateTime) { this.zonedDateTime = zonedDateTime; } private DateTimeBuilder(LocalDateTime localDateTime) { this.zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault()); } private DateTimeBuilder(LocalDateTime localDateTime, ZoneId zoneId) { this.zonedDateTime = ZonedDateTime.of(localDateTime, zoneId); } /** * 採用預設時區 * * @return */ public static DateTimeBuilder localDateTime () { return new DateTimeBuilder(LocalDateTime.now()); } }
指定時間 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public DateTimeBuilder with(int hour, int minute, int second) { add((localDateTime) -> localDateTime.withHour(hour).withMinute(minute).withSecond(second)); return this; } public DateTimeBuilder withHour(int value) { add((localDateTime) -> localDateTime.withHour(value)); return this; } public DateTimeBuilder withMinute(int value) { add((localDateTime) -> localDateTime.withMinute(value)); return this; } public DateTimeBuilder withSecond(int value) { add((localDateTime) -> localDateTime.withSecond(value)); return this; } public DateTimeBuilder withMilliSecond(int value) { add((localDateTime) -> localDateTime.with(ChronoField.MILLI_OF_SECOND, value)); return this; }
plus時間 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public DateTimeBuilder plusYears(int value) { add((zonedDateTime) -> zonedDateTime.plusYears(value)); return this; } public DateTimeBuilder plusMonths(int value) { add((zonedDateTime) -> zonedDateTime.plusMonths(value)); return this; } public DateTimeBuilder plusWeeks(int value) { add((zonedDateTime) -> zonedDateTime.plusWeeks(value)); return this; } public DateTimeBuilder plusDays(int value) { add((zonedDateTime) -> zonedDateTime.plusDays(value)); return this; } public DateTimeBuilder plusHours(int value) { add((zonedDateTime) -> zonedDateTime.plus(value, ChronoUnit.HOURS)); return this; } public DateTimeBuilder plusMinutes(int value) { add((zonedDateTime) -> zonedDateTime.plus(value, ChronoUnit.MINUTES)); return this; } public DateTimeBuilder plusSeconds(int value) { add((zonedDateTime) -> zonedDateTime.plus(value, ChronoUnit.SECONDS)); return this; } public DateTimeBuilder plusMillis(int value) { add((zonedDateTime) -> zonedDateTime.plus(value, ChronoUnit.MILLIS)); return this; }
minus時間 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public DateTimeBuilder minusYears(int value) { add((zonedDateTime) -> zonedDateTime.minusYears(value)); return this; } public DateTimeBuilder minusMonths(int value) { add((zonedDateTime) -> zonedDateTime.minusMonths(value)); return this; } public DateTimeBuilder minusWeeks(int value) { add((zonedDateTime) -> zonedDateTime.minusWeeks(value)); return this; } public DateTimeBuilder minusDays(int value) { add((zonedDateTime) -> zonedDateTime.minusDays(value)); return this; } public DateTimeBuilder minusHours(int value) { add((zonedDateTime) -> zonedDateTime.minus(value, ChronoUnit.HOURS)); return this; } public DateTimeBuilder minusMinutes(int value) { add((zonedDateTime) -> zonedDateTime.minus(value, ChronoUnit.MINUTES)); return this; } public DateTimeBuilder minusSeconds(int value) { add((zonedDateTime) -> zonedDateTime.minus(value, ChronoUnit.SECONDS)); return this; } public DateTimeBuilder minusMillis(int value) { add((zonedDateTime) -> zonedDateTime.minus(value, ChronoUnit.MILLIS)); return this; }
Example 1 2 3 4 DateTimeBuilder.localDateTime().toTimestamp(); DateTimeBuilder.localDateTime().withSecond(0).withMilliSecond(0).minusSeconds(secondsAgo).toTimestamp(); DateTimeBuilder.localDateTime().withMinTime().minusDays(dayAgo).toTimestamp(); ...