我正在使用MapStruct将值从源映射到目标类。两个类都应具有日期属性,但具有不同的日期格式。 如何使用MapStruct映射属性时转换dateformat?
源类的日期格式:2018-05-18T18:43:33.623 + 0200
目标类的日期格式:2018-05-18
答案 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 的许多答案解释了用于每个工作的最佳对象(尤其是在处理时区时!)
快乐编码! ;)