JavaSE&Java8 时间日期API + 使用心得

文章目录

  • [1. LocalDate](#1. LocalDate)
  • [2. LocalTime](#2. LocalTime)
  • [3. LocalDateTime](#3. LocalDateTime)
    • [3.1创建 LocalDateTime](#3.1创建 LocalDateTime)
    • [3.2 LocalDateTime获取方法](#3.2 LocalDateTime获取方法)
  • [4. LocalDateTime转换方法](#4. LocalDateTime转换方法)
    • [4.1 LocalDateTime增加或者减少时间的方法](#4.1 LocalDateTime增加或者减少时间的方法)
    • [4.2 LocalDateTime修改方法](#4.2 LocalDateTime修改方法)
  • [5. Period](#5. Period)
  • [6. Duration](#6. Duration)
  • [7. 格式转换](#7. 格式转换)
    • [7.1 时间日期转换为字符串](#7.1 时间日期转换为字符串)
    • [7.2 字符串转换为时间日期](#7.2 字符串转换为时间日期)
  • [8. LocalDateTime在SpringBoot中的应用](#8. LocalDateTime在SpringBoot中的应用)
    • [8.1 将LocalDateTime字段以时间戳的方式返回给前端 添加日期转化类](#8.1 将LocalDateTime字段以时间戳的方式返回给前端 添加日期转化类)
    • [8.2 将LocalDateTime字段以指定格式化日期的方式返回给前端](#8.2 将LocalDateTime字段以指定格式化日期的方式返回给前端)
    • [8.3 对前端传入的日期进行格式化](#8.3 对前端传入的日期进行格式化)
    • [8.4 前后端日期时间转化问题](#8.4 前后端日期时间转化问题)
  • 其他

1. LocalDate

java 复制代码
LocalDate now = LocalDate.now();
System.out.println(now);//2023-04-07
System.out.println(now.getYear());//2023
System.out.println(now.getMonthValue());//4
System.out.println(now.getDayOfMonth());//7
System.out.println(now.getDayOfWeek());//FRIDAY
System.out.println(now.getDayOfWeek().getValue());//5

2. LocalTime

java 复制代码
LocalTime now = LocalTime.now();
System.out.println(now);//08:43:06.518
System.out.println(now.getHour());//8
System.out.println(now.getMinute());//43
System.out.println(now.getSecond());//37

3. LocalDateTime

3.1创建 LocalDateTime

sql 复制代码
//	获取当前系统时间(2022-11-30T16:26:13.158)
LocalDateTime now = LocalDateTime.now();

//	指定年月日和时分秒初始化(2022-11-30T10:00:15)
LocalDateTime localDateTime = LocalDateTime.of(2022, 11, 30, 10, 00, 15);

3.2 LocalDateTime获取方法

  • 获取年
sql 复制代码
System.out.println(localDateTime.getYear());	//	2022
  • 获取月
sql 复制代码
System.out.println(localDateTime.getMonthValue());	//	11
  • 获取日
sql 复制代码
System.out.println(localDateTime.getDayOfYear());	//	334
System.out.println(localDateTime.getDayOfMonth());	//30
System.out.println(localDateTime.getDayOfWeek());	// WEDNESDAY
  • 获取小时和分钟
sql 复制代码
System.out.println(now.getHour());	//16
System.out.println(now.getMinute());	//34

4. LocalDateTime转换方法

  • 转换成为一个LocalDate对象
sql 复制代码
LocalDate localDate = now.toLocalDate();	//	2022-11-30
  • 转换成为一个LocalTime对象
sql 复制代码
LocalTime localTime = now.toLocalTime();	//	16:36:15.903
java 复制代码
LocalDateTime now = LocalDateTime.now();
System.out.println(now);//2023-04-07T08:44:59.799

System.out.println(now.toLocalDate());2023-04-07
System.out.println(now.toLocalTime());//08:44:59.799

4.1 LocalDateTime增加或者减少时间的方法

LocalDate**、LocalTimeLocalDateTime、**Instant 为不可变对象,修改这些对象对象会返回一个副本

java 复制代码
LocalDateTime localDateTime = LocalDateTime.of(2022, 11, 30, 13, 14, 52);
//2022-11-30T13:14:52
System.out.println(localDateTime);
//2023-11-30T13:14:52
System.out.println(localDateTime.plusYears(1));
//2022-11-30T13:15:52
System.out.println(localDateTime.plusMinutes(1));
//2022-12-01T13:14:52
System.out.println(localDateTime.plusDays(1));
//2022-11-30T14:14:52
System.out.println(localDateTime.plusHours(1));
//2022-11-30T13:15:52
System.out.println(localDateTime.plusMinutes(1));
//2022-11-30T13:14:53
System.out.println(localDateTime.plusSeconds(1));
//2022-12-07T13:14:52
System.out.println(localDateTime.plusWeeks(1));

4.2 LocalDateTime修改方法

方法名 说明
public LocalDateTime withYear(int year) 直接修改年
public LocalDateTime withMonth(int month) 直接修改月
public LocalDateTime withDayOfMonth(int dayofmonth) 直接修改日期(一个月中的第几天)
public LocalDateTime withDayOfYear(int dayOfYear) 直接修改日期(一年中的第几天)
public LocalDateTime withHour(int hour) 直接修改小时
public LocalDateTime withMinute(int minute) 直接修改分钟
public LocalDateTime withSecond(int second) 直接修改秒

5. Period

Period:用于计算两个"日期"间隔 。

Period 定义了日期间隔,通过 Period.between 得到了两个 LocalDate 的差,返回的是两个日期差几年零几月零几天。如果希望得知两个日期之间差几天,直接调用 Period 的 getDays() 方法得到的只是最后的"零几天",而不是算总的间隔天。

java 复制代码
LocalDate now = LocalDate.now();
System.out.println(now);//2023-04-07
System.out.println(Period.between(now, LocalDate.of(2021, 12, 24)));//P-1Y-3M-14D
System.out.println(Period.between(now, LocalDate.of(2021, 12, 24)).getDays());//-14

System.out.println(Period.between(now, LocalDate.of(2024, 12, 24)));//P1Y8M17D
System.out.println(Period.between(now, LocalDate.of(2025, 12, 24)).getDays());//17

API

方法名 说明
public static Period between(开始时间,结束时间) 计算两个"时间"的间隔
public int getYears() 获得这段时间的年数
public int getMonths() 获得此期间的总月数
public int getDays() 获得此期间的天数
public long toTotalMonths() 获取此期间的总月数

6. Duration

Duration:用于计算两个"时间"间隔。

方法名 说明
public static Durationbetween(开始时间,结束时间) 计算两个"时间"的间隔
public long toSeconds() 获得此时间间隔的秒
public int toMillis() 获得此时间间隔的毫秒
public int toNanos() 获得此时间间隔的纳秒

7. 格式转换

7.1 时间日期转换为字符串

java 复制代码
LocalDate localDate = LocalDate.of(2020, 10, 10);  
String s1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE); //20201010 
String s2 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);  //2020-10-10

DateTimeFormatter默认提供了多种格式化方式,如果默认提供的不能满足要求,可以通过DateTimeFormatter的ofPattern方法创建自定义格式化方式

java 复制代码
LocalDateTime now = LocalDateTime.now();
System.out.println(now);//2023-04-07T09:23:27.606
System.out.println(now.format(DateTimeFormatter.BASIC_ISO_DATE));//20230407
System.out.println(now.format(DateTimeFormatter.ISO_LOCAL_DATE));//2023-04-07
System.out.println(now.format(DateTimeFormatter.ISO_DATE_TIME));//2023-04-07T09:23:27.606

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(now.format(dateTimeFormatter));//2023-04-07 09:24:30

7.2 字符串转换为时间日期

java 复制代码
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse("2023-04-07 10:10:10", formatter);
System.out.println(localDateTime);//2023-04-07T10:10:10
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate localDate = LocalDate.parse("2023-04-09", formatter2);
System.out.println(localDate);//2023-04-09

8. LocalDateTime在SpringBoot中的应用

8.1 将LocalDateTime字段以时间戳的方式返回给前端 添加日期转化类

java 复制代码
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) 注解,如下:

java 复制代码
@JsonSerialize(using = LocalDateTimeConverter.class)  
protected LocalDateTime gmtModified;  

8.2 将LocalDateTime字段以指定格式化日期的方式返回给前端

在LocalDateTime 字段上添加@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") 注解即可,如下:

java 复制代码
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")  
protected LocalDateTime gmtModified;  

8.3 对前端传入的日期进行格式化

在LocalDateTime字段上添加@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 注解即可,如下:

java 复制代码
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")  
protected LocalDateTime gmtModified;

8.4 前后端日期时间转化问题

在实体类上加@DatetimeFormat与@JsonFormat注解

@DatetimeFormat 将前台日期字符串转换成Date格式 @DateTimeFormat(pattern="yyyy-MM-dd")

@JsonFormat 将服务器端Date日期转换成指定字符串格式 @JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")

两个需要同时加,否则会有时区的问题

其他

获取两个时间之间的间隔(天-时-分)

java 复制代码
/**
 * 创建时间: 2023/4/23
 * 函数名称:
 * 函数功能: 获取两个时间之间的 范围
 * 函数参数:
 *      * @param begin: 开始
 *      * @param end: 结束
 *  @return: String
 *  @author: Snow
 *******************************************************
 * 修改记录(时间--修改人--修改说明):
 */
public static String getTwoDateTime(LocalDateTime begin, LocalDateTime end){

    end = end == null ? LocalDateTime.now() : end;

    String durationTime;

    Duration duration = Duration.between(begin, end);

    //  秒
    long seconds = duration.getSeconds();
    //  天
    int days = (int)(seconds / DAY_SECONDS);
    //  总秒数 - 天数后剩余的秒数
    int remainderSeconds = (int)(seconds % DAY_SECONDS);

    //  小时0
    int hours = remainderSeconds / 3600;

    //  剩余秒数
    remainderSeconds = remainderSeconds % 3600;

    int minutes = remainderSeconds / 60;

    durationTime = (days > 0 ? days + "天" : "") 
    +  (hours > 0 ? hours + "时" : "") + (minutes > 0 ? minutes + "分钟" : "1分钟");
    return durationTime;
}
相关推荐
浪里个浪的1024几秒前
【C语言】计算3x3矩阵每行的最大值并存入第四列
c语言·开发语言·矩阵
@东辰8 分钟前
【golang-技巧】-自定义k8s-operator-by kubebuilder
开发语言·golang·kubernetes
Hello-Brand8 分钟前
Java核心知识体系10-线程管理
java·高并发·多线程·并发·多线程模型·线程管理
乐悠小码14 分钟前
数据结构------队列(Java语言描述)
java·开发语言·数据结构·链表·队列
史努比.16 分钟前
Pod控制器
java·开发语言
2的n次方_18 分钟前
二维费用背包问题
java·算法·动态规划
皮皮林55119 分钟前
警惕!List.of() vs Arrays.asList():这些隐藏差异可能让你的代码崩溃!
java
莳光.19 分钟前
122、java的LambdaQueryWapper的条件拼接实现数据sql中and (column1 =1 or column1 is null)
java·mybatis
程序猿麦小七24 分钟前
基于springboot的景区网页设计与实现
java·spring boot·后端·旅游·景区
敲敲敲-敲代码25 分钟前
游戏设计:推箱子【easyx图形界面/c语言】
c语言·开发语言·游戏