前端后台之间时间的传输,前端传时间戳后台如何接收,,时间戳转换成LocalDateTime
前端与后端之间时间的传输大概有以下几种实现方式@DateTimeFormat和@JsonFormat注解配置文件中统一设置converter手动转换大概有以下几种实现方式前端传的参大概有这么几种格式:时间戳、yyyy-MM-dd、yyyy-MM-dd HH:mm:ss。下面介绍几种常见的处理方式,时间戳直接跳到Converter。@DateTimeFormat和@JsonFormat注解@Date
·
大概有以下几种实现方式
前端传的参大概有这么几种格式:
时间戳、yyyy-MM-dd、yyyy-MM-dd HH:mm:ss。
下面介绍几种常见的处理方式,时间戳直接跳到Converter。
@DateTimeFormat和@JsonFormat注解
@DateTimeFormat是前端往后段传的时候使用,加在实体类中,然后controller中直接使用这个实体类接收参数。当前端传固定格式的字符串的时候会转换成date
@JsonFormat是后端往前端传输的时候使用。
@Data
public class SearchDTO {
// 前端需要传这种格式的字符串
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date time;
}
@GetMapper("/search")
public Result<List<InvoiceVO>> invoiceList(SearchDTO searchdto) {
System.out.println(searchdto.getTime);
}
配置文件中统一设置
@DateTimeFormat和@JsonFormat需要在每个类中都添加,我们可以直接在配置文件中统一配置
spring:
mvc:
date-format: yyyy-MM-dd HH:mm:ss
throw-exception-if-no-handler-found: true
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
serialization:
write-dates-as-timestamps: true
converter手动转换
前面几种实现方式都不支持时间戳的解析,下面我们重新实现jackson对Date类型和LocalDateTime类型的解析。
public class DateConverter implements Converter<String, Date> {
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final String shortDateFormat = "yyyy-MM-dd";
private static final String timeStampFormat = "^\\d+$";
@Override
public Date convert(String value) {
if(value == null || StringUtils.isEmpty(value))
return null;
value = value.trim();
try {
if (value.contains("-")) {
SimpleDateFormat formatter;
if (value.contains(":")) {
formatter = new SimpleDateFormat(dateFormat);
} else {
formatter = new SimpleDateFormat(shortDateFormat);
}
return formatter.parse(value);
} else if (value.matches(timeStampFormat)) {
Long lDate = new Long(value);
return new Date(lDate);
}
} catch (Exception e) {
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
@Override
public JavaType getInputType(TypeFactory typeFactory) {
return null;
}
@Override
public JavaType getOutputType(TypeFactory typeFactory) {
return null;
}
}
public class LocalDateTimeConverter implements Converter<String, LocalDateTime> {
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final String shortDateFormat = "yyyy-MM-dd";
private static final String timeStampFormat = "^\\d+$";
@Override
public LocalDateTime convert(String value) {
if(value == null || StringUtils.isEmpty(value))
return null;
value = value.trim();
try {
if (value.contains("-")) {
SimpleDateFormat formatter;
if (value.contains(":")) {
formatter = new SimpleDateFormat(dateFormat);
} else {
formatter = new SimpleDateFormat(shortDateFormat);
}
return formatter.parse(value).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
} else if (value.matches(timeStampFormat)) {
Long lDate = new Long(value);
return new Date(lDate).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
} catch (Exception e) {
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
@Override
public JavaType getInputType(TypeFactory typeFactory) {
return null;
}
@Override
public JavaType getOutputType(TypeFactory typeFactory) {
return null;
}
}
现在我们要把我们自己写的注册一下
@ControllerAdvice
public class ControllerHandler {
@InitBinder
public void initBinder(WebDataBinder binder) {
// 注册converter
binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(new DateConverter().convert(text));
}
});
binder.registerCustomEditor(LocalDateTime.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(new LocalDateTimeConverter().convert(text));
}
});
}
}
到这里,我们controller里就能直接接收时间戳转化成Date和LocalDateTime了。
public Result<List<InvoiceVO>> invoiceList(
@RequestParam(required = false) LocalDateTime beginTime) {
}
对于@RequestBody注解里面的时间类型现在还不可以转换,添加下面代码
@Configuration
public class DateConfig {
/**
* 默认日期时间格式
*/
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
/**
* Date转换器,用于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, Date> dateConverter() {
return new DateConverter();
}
@Bean
public Converter<String, LocalDateTime> localDateTimeConverter() {
return new LocalDateTimeConverter();
}
/**
* Json序列化和反序列化转换器,用于转换Post请求体中的json以及将我们的对象序列化为返回响应的json
* 使用@RequestBody注解的对象中的Date类型将从这里被转换
*/
@Bean
public ObjectMapper objectMapper(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
JavaTimeModule javaTimeModule = new JavaTimeModule();
//Date序列化和反序列化
javaTimeModule.addSerializer(Date.class, new JsonSerializer<Date>() {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
SimpleDateFormat formatter = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
String formattedDate = formatter.format(date);
jsonGenerator.writeString(formattedDate);
}
});
javaTimeModule.addDeserializer(Date.class, new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
return new DateConverter().convert(jsonParser.getText());
}
});
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}
}
ok,大功告成,部分内容参考:https://www.cnblogs.com/eknown/p/11968101.html
更多推荐
已为社区贡献1条内容
所有评论(0)