如何使用MapStruct将日期字符串转换为另一种格式?

时间:2018-05-18 17:47:44

标签: date format mapstruct

我正在使用MapStruct将值从源映射到目标类。两个类都应具有日期属性,但具有不同的日期格式。 如何使用MapStruct映射属性时转换dateformat?

源类的日期格式:2018-05-18T18:43:33.623 + 0200

目标类的日期格式:2018-05-18

2 个答案:

答案 0 :(得分:0)

我假设您的日期属性为String类型。

您可以为此创建自定义限定方法,并选择该方法来映射源和目标。看看Mapping method selection based on qualifiers

它看起来像:

@Mapper
public interface MyMapper {

    @Mapping(target = "dateProperty", source = "dateProperty", qualifiedBy = WithTimezoneToLocalDate.class)
    Target map(Source source);

    @WithTimezoneToLocalDate
    default String timezoneToLocalDate(String source) {
        // Do your conversion here
    }

}


import org.mapstruct.Qualifier;

@Qualifier
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface WithTimezoneToLocalDate {
}

答案 1 :(得分:0)

处理源对象/对象字段

假设源是一个字符串,首先必须将其解析为“日期”对象,然后您可以将其转换为您喜欢的任何格式。

其他的解决方案也可以,你也可以使用“表达式”,当数据必须在发送到目标对象之前进行处理时。

它还允许您使用其他语言(例如 Javascript),但现在让我们使用 Java:

@Mapper(componentModel = "spring")
public interface PaymentMethodMapper extends EntityMapper<PaymentMethodDTO, PaymentMethod> {

    @Mapping(source = "creditCard.id", target = "creditCardId")
     // ...
    @Mapping(target = "expireDate", expression = "java(creditCardExpire(paymentMethod.getCreditCard()))")
    PaymentMethodDTO toDto(PaymentMethod paymentMethod);


    default String creditCardExpire(CreditCard cc) {
        LocalDate expDate = LocalDate.of(cc.getExpirationYear(), cc.getExpirationMonth(), 1);
        return  expDate.format(DateTimeFormatter.ofPattern("MM/yy"));
    }

     // ...
}

基本上,您指定表达式的语言 (java),括号之间是函数调用,稍后在同一接口中定义。您可以将单个值或整个对象传递给它,具体取决于您需要做什么。

在本例中,我有 ...toDto(PaymentMethod paymentMethod),paymentMethod 是我决定提供给函数的源对象。

将具有特定格式的字符串解析为“日期”对象

您的约会对象在 ISO format,这真的很好:2018-05-18T18:43:33.623+0200

首先告诉Java如何解析输入:

DateTimeFormatter dtFormatter = DateTimeFormatter.ISO_DATE_TIME;

然后,将源字符串输入格式化程序

TemporalAccessor t = dtFormatter.parse("2018-05-18T18:43:33.623+0200");

现在由您根据需要选择最终输出对象:

// Instant: keep a reference on the timeline
Instant momentInTime = Instant.from(t);


// LocalDateTime: just date & time information, with no reference to other 
events on the timeline
LocalDateTime dt = LocalDateTime.from(t);


// LocalDate - finally, the date that you requested:
LocalDate d = LocalDate.from(t);

System.out.println("Your date: " + d.toString());

从日期对象返回格式化字符串

有时我们需要以某种格式从日期返回到字符串。

首先看一下DateTimeFormatter类中定义的标准格式,有很多有用的东西,如果你的没有,你可以自己构建一个(参见“格式和解析的模式”)文档)。

 LocalDate date = LocalDate.now();
 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
 String text = date.format(formatter);

输出:2021 01 02


我希望答案不会太远......!

java.time 在处理日期/时间时非常有用,关于 stackoverflow 的许多答案解释了用于每个工作的最佳对象(尤其是在处理时区时!)

快乐编码! ;)