java 从Date到LocalDateTime的Mapstruct转换

yc0p9oo0  于 2023-05-05  发布在  Java
关注(0)|答案(3)|浏览(565)

我尝试使用带有Mapstruct的Map器将一个对象转换为带有LocalDateTime字段的对象,该Map器带有Date(java.util.Date)字段。问题是它Map的时间是错误的,因为在带有LocalDateTime字段的对象中,它总是显示少2小时。

@Mapping(source = "createdDate", target = "createdLocalDateTime")
ObjectA toEntity(ObjectB);

我认为问题在于自动实现:

if ( createdDate!= null ) {
        objectA.createdLocalDateTime( LocalDateTime.ofInstant( createdDate.toInstant(), ZoneId.of( "UTC" ) ) );
    }

我该怎么解决这个问题?谢谢!

xfb7svmp

xfb7svmp1#

在mapstruct issues tracker上已经有关于此的对话。在那里,他们谈论失去一天,但原因和解决方案是相似的:
您可以做的解决方案是提供自己的方式在Date到LocalDate之间进行Map。
例如

public class DateUtils {

    public static LocalDate toLocalDate(Date date) {
        return date == null ? null : date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
    }

}

并确保DateUtils是Mapper#uses的一部分。这样,MapStruct将使用您的自定义函数在Date和LocalDate之间进行Map。

cu6pst1q

cu6pst1q2#

一个基本的转换是

Date date= new Date();
 LocalDateTime localdate= date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

因为你还没有发布你的转换代码,我们不知道你那边发生了什么。

xvw2m8pv

xvw2m8pv3#

使用MapperStruct的一个接口将格式分段:

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface LoyaltyMapper {

default LocalDateTime transactionDateToLocalDateTime(final LocalDate transactionDate) {
    final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

    final String transactionDateTimeFormatter = transactionDate.atTime(0, 0, 0, 0).format(dateTimeFormatter);
    final LocalDateTime transactionDateTime = LocalDateTime.parse(transactionDateTimeFormatter, dateTimeFormatter);
    return transactionDateTime;
  }
}

相关问题