Len's Study-Log

集中一点,登峰造极!

0%

java8Time随笔

Instant:瞬时实例
LocalDate:本地日期,不包含具体时间。例如:2014-01-14可以用来记录生日、纪念日、加盟日等。
LocalTime:本地时间,不包含日期
LocalDateTime:组合了日期和时间,但不包含时差和时区信息
ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差

  1. 获取当前时间:LocalDateTime.now();
  2. 日期格式化:
    1
    2
    3
    4
    5
    6
    7
    DateTimeFormatter默认提供了多种格式化方式:
    LocalDate localDate = LocalDate.of(2019, 9, 10);
    String s1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);
    String s2 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);

    如果默认提供的不能满足要求,可以通过DateTimeFormatter的ofPattern方法创建自定义格式化方式
    LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a"));
    3.解析时间
1
2
LocalDate localDate1 = LocalDate.parse("20190910", DateTimeFormatter.BASIC_ISO_DATE);  
LocalDate localDate2 = LocalDate.parse("2019-09-10", DateTimeFormatter.ISO_LOCAL_DATE);
  1. 获取时间戳:Instant.now().toEpochMilli()
    Instant.now() (获取的是格林威治时间/世界时)
    Date.from(Instant)将Instant转换成java.util.Date,Date.toInstant()则是将Date类转换成Instant类。)
  2. LocalDateTime转String: LocalDateTime.parse(str,dateTimeFormatter); String转LocalDateTime: localDateTime.format(dateTimeFormatter);
  3. Date转LocalDateTime:LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
  4. LocalDateTime转Date:Date date = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());

LocalDate转LocalDateTime:LocalDateTime.of(LocalDate.parse("2021-01-08", DateTimeFormatter.ofPattern("yyyy-MM-dd")),LocalTime.MIN)

LocalDateTime转LocalDate:localDateTime.toLocalDate()

  1. 前端传过来的日期字符串怎么转换并放到数据库
  2. 获取某天的最开始那一秒(最开始时间):LocalDateTime.of(oneDayLocalDate,LocalTime.MIN)
  3. 通过with修改某些值
1
2
3
4
//修改年为2020
localDateTime = localDateTime.withYear(2020);
//修改为2022
localDateTime = localDateTime.with(ChronoField.YEAR, 2022);
  1. 通过自定义数据类型转换器返回时间戳给前端
1
2
3
4
5
6
7
8
9
10
11
12
// 新建一个类数据类型转换器
public class LocalDateTimeConverter extends JsonSerializer<LocalDateTime> {

@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeNumber(value.toInstant(ZoneOffset.of("+8")).toEpochMilli());
}
}

// 然后在LocalDateTime类型的字段上,加上注解:
@JsonSerialize(using = LocalDateTimeConverter.class)

  1. 一些例子
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
LocalDate localDate = LocalDate.now();
System.out.println("LocalDate.now():"+localDate);
System.out.println("localDate.getYear():"+localDate.getYear());
System.out.println("localDate.getMonth():"+localDate.getMonth());
System.out.println("localDate.getMonthValue():"+localDate.getMonthValue());
System.out.println("localDate.getDayOfMonth():"+localDate.getDayOfMonth());
System.out.println("localDate.getDayOfWeek():"+localDate.getDayOfWeek());
System.out.println("localDate.getDayOfWeek().getValue():"+localDate.getDayOfWeek().getValue());

LocalTime localTime = LocalTime.now();
System.out.println("当前时间LocalTime.now(): " + localTime);
System.out.println("当前时间+1小时 localTime.plusHours(1): " + localTime.plusHours(1));
System.out.println("当前时间-1小时 localTime.plusHours(1): " + localTime.minusHours(1));

Clock clock = Clock.systemUTC();
Clock clock2 = Clock.systemDefaultZone();
System.out.println("Clock : " + clock.millis());
System.out.println("clock2 : " + clock2.millis());
System.out.println("= 获取当前的时间戳 =");
Instant timestamp = Instant.now();
System.out.println("获取当前的时间戳: "+timestamp);
System.out.println("= 格式化日期 =");
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a");
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(" LocalDateTime.now(): "+localDateTime);
System.out.println(" 格式化后的日期:"+localDateTime.format(format));

System.out.println("= 检查生日等周期性事件 =");
LocalDate dateOfBirth = LocalDate.of(2019, 7, 25);
MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(localDate);

if(currentMonthDay.equals(birthday)){
System.out.println(" Many Many happy returns of the day !!");
}else{
System.out.println(" Sorry, today is not your birthday");
}