Skip to main content
 首页 » 编程设计

Java YearMonth日期类应用

2022年07月19日171lonelyxmas

Java YearMonth日期类应用

在项目中会遇到仅需要存取年月,由于数据库一般不支持不完整日期格式,因此日期之间转换比较麻烦。本文通过介绍YearMonth类实现年月日期存取过程。

1. 概述

YearMonth是不可变的日期时间对象,表示年、月的组合。其实现了Comparable接口。

2. YearMonth类方法

YearMonth类主要方法如下表:

方法 描述
String format(DateTimeFormatter formatter) 使用特定的格式格式化year-month
int get(TemporalField field) 返回日期中特定域的int类型
boolean isLeapYear() 是否闰年
static YearMonth now() 根据当前时间返回YearMonth实例
static YearMonth of(int year, int month) 根据年、月返回YearMonth实例
YearMonth plus(TemporalAmount amountToAdd) 返回year-month增加一定数量的拷贝
YearMonth minus (TemporalAmount amountToSubtract) 返回year-month减少一定数量的拷贝

3. YearMonth类方法示例

格式化为字符串

YearMonth ym = YearMonth.now();   
String s = ym.format(DateTimeFormatter.ofPattern("MM yyyy"));   
System.out.println(s);   

获取特定域

YearMonth y = YearMonth.now();   
long l1 = y.get(ChronoField.YEAR);   
System.out.println(l1);   
long l2 = y.get(ChronoField.MONTH_OF_YEAR);   
System.out.println(l2);   

增加月份

YearMonth ym1 = YearMonth.now();   
YearMonth ym2 = ym1.plus(Period.ofYears(2));   
System.out.println(ym2);   

减少月份

YearMonth ym1 = YearMonth.now();   
YearMonth ym2 = ym1.minus(Period.ofYears(2));   
System.out.println(ym2);   

4.实际应用

实际项目需求中每月需要制定计划,计划月份无需精确到日,所有打算使用YearMonth类型。但数据库层不支持YearMonth,只能存储Date类型,需要必要的转换。

4.1. 定义前端请求实体

static final String STD_YEAR_MONTH_PATTERN = "yyyy-MM" 
 
@JsonFormat(pattern = STD_YEAR_MONTH_PATTERN, shape = JsonFormat.Shape.STRING) 
@DateTimeFormat(pattern = STD_YEAR_MONTH_PATTERN) 
YearMonth planMonth; 

4.2 定义实体类型

因为实体类型对应数据库,故定义为LocalDate类型。

private LocalDate planMonth; 

4.3. 类型转换

/** 
    * 转换YearMonth为LocalDate 
    */ 
public static LocalDate parseDateYearMonth(YearMonth yearMonth){ 
    return LocalDate.of(yearMonth.getYear(),yearMonth.getMonthValue(),1); 
} 
 
/** 
    * 转换LocalDate为YearMonth 
    */ 
public static YearMonth parseYearMonth(LocalDate localDate){ 
    return YearMonth.of(localDate.getYear(),localDate.getMonthValue()); 
} 

自动映射

实际中DTO之间映射通过Orika 框架实现,但REQ类与实体类之间的日期类型不统一,需要手工通过上述方法进行映射,所以需要忽略该字段进行映射。定义映射规则如下:

@Component
public class DtoMapper extends ConfigurableMapper {

@Override 
protected void configure(MapperFactory factory) { 
    factory.classMap(ZfjgPlanEntity.class,ZfjgPlanReq.class) 
        .exclude("planMonth") 
        .byDefault().register(); 
} 

}

总结

本文介绍了YearMonth类及其主要方法。同时也介绍实际项目中如何进行转换和存储。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/81702426
阅读延展