spring,get请求中带date日期格式参数,后台无法转换的问题

本文介绍了一种使用JavaScript进行日期格式转换的方法,具体展示了如何将不同格式的日期字符串转换为统一的MM/dd/yyyy HH:mm格式,这对于需要处理大量日期数据的应用场景尤为实用。
 			var bb = new Date(ab.substring(0, 10)).format("MM/dd/yyyy 00:00:00");
            var cc = new Date(ab.substring(13, aa.length)).format("MM/dd/yyyy 23:59:59");

要使用 MM/dd/yyyy HH:mm 这种斜杠的格式才行

### Spring Boot 中配置时区相关的日期转换拦截器 为了实现基于用户选择的时区来格式化日期的功能,可以通过自定义 `WebDataBinder` 和全局异常处理器的方式完成。以下是具体的实现方法: #### 1. 创建自定义日期转换器 通过扩展 `Converter<String, Date>` 接口并支持多种时间格式以及用户的时区设置。 ```java package com.example.converter; import org.apache.commons.lang3.time.DateUtils; import org.springframework.core.convert.converter.Converter; import java.text.ParseException; import java.util.Date; public class CustomDateConverter implements Converter<String, Date> { private final String[] datePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss"}; @Override public Date convert(String source) { try { return DateUtils.parseDate(source, datePatterns); } catch (ParseException e) { throw new IllegalArgumentException("Invalid date format: " + source, e); } } } ``` 此部分实现了基础的时间字符串到 `Date` 对象的转换功能[^1]。 --- #### 2. 注册自定义日期转换器至 Web 层 在控制器层注册该转换器以供全局使用。 ```java package com.example.config; import com.example.converter.CustomDateConverter; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @InitBinder public void initBinder(WebDataBinder binder) { binder.addCustomFormatter(new CustomDateConverter()); } @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new CustomDateConverter()); } } ``` 这段代码确保了所有的请求参数中的日期字段都能被自动解析为指定格式的对象[^1]。 --- #### 3. 增加时区处理逻辑 为了让系统能够动态调整不同用户的时区需求,可以引入 HTTP 请求头或者查询参数作为输入源之一。例如,允许客户端传入名为 `timezone` 的参数表示其所在时区。 修改原有转换器类如下: ```java package com.example.converter; import org.apache.commons.lang3.time.DateUtils; import org.springframework.core.convert.converter.Converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; public class TimeZoneAwareDateConverter implements Converter<String, Date> { private static final String[] DATE_PATTERNS = {"yyyy-MM-dd", "yyyy-MM-dd'T'HH:mm:ss.SSSZ"}; @Override public Date convert(String source) { for (String pattern : DATE_PATTERNS) { try { SimpleDateFormat sdf = new SimpleDateFormat(pattern); // 获取当前线程绑定的时区,默认 UTC 如果未提供具体值 String timeZoneParam = ThreadLocalContextHolder.getTimeZone(); if (timeZoneParam != null && !timeZoneParam.isEmpty()) { sdf.setTimeZone(TimeZone.getTimeZone(timeZoneParam)); } else { sdf.setTimeZone(TimeZone.getDefault()); // 或者设定默认时区如 GMT+8 } return sdf.parse(source); } catch (ParseException ignored) {} } throw new IllegalArgumentException("Unable to parse the date/time"); } } // 定义一个工具类用于存储线程局部变量 class ThreadLocalContextHolder { private static final ThreadLocal<String> TIME_ZONE_CONTEXT_HOLDER = new ThreadLocal<>(); public static void setTimeZone(String timezone) { TIME_ZONE_CONTEXT_HOLDER.set(timezone); } public static String getTimeZone() { return TIME_ZONE_CONTEXT_HOLDER.get(); } public static void clear() { TIME_ZONE_CONTEXT_HOLDER.remove(); } } ``` 这里增加了对时区的支持能力,并利用 `ThreadLocal` 来保存每次调用期间特定于线程的信息[^1]。 --- #### 4. 控制器层面捕获时区信息 最后一步是在接收外部 API 调用之前提取出所需的时区数据,并将其注入到上下文中去影响后续操作行为。 ```java @RestController @RequestMapping("/api/v1") public class ExampleController { @GetMapping("/date") public ResponseEntity<DateResponse> getDate(@RequestParam(required = false) String timezone, @RequestParam String dateString) throws ParseException { // 设置线程本地变量 ThreadLocalContextHolder.setTimeZone(timezone); try { // 使用有时区感知的转换器实例化对象 TimeZoneAwareDateConverter converter = new TimeZoneAwareDateConverter(); Date parsedDate = converter.convert(dateString); return ResponseEntity.ok(new DateResponse(parsedDate)); } finally { // 清理资源防止内存泄漏 ThreadLocalContextHolder.clear(); } } } @Data @AllArgsConstructor @NoArgsConstructor static class DateResponse { private Date formattedDate; } ``` 以上展示了如何结合前端传递过来的数据与后台服务端内部机制共同作用从而达到预期效果[^1]。 --- ### 总结 整个过程涵盖了从简单的日期字符串转成标准 Java 类型直至考虑国际化场景下的复杂情况等多个方面知识点。最终形成了既满足基本业务又兼顾灵活性的设计方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值