Java8日期/時間

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();
...