fastjson2
fastjson2 copied to clipboard
[QUESTION]Spring boot集成了FastJson2后,有没有什么好的方法动态处理时区
请描述您的问题
由于项目中不同的用户有不同的时区,数据库里存的是0时区的时间。表里记录了某个用户选中的时区。前端处理遇到好多控件上的问题,有没有什么的好的方案后端返回数据的时候动态替换下时区呢~
- 设置
JSON.configWriterDateFormat("millis")让 Fastjson2 直接输出时间戳,时间戳是没有时区概念的,然后让前端将时间戳基于当地时区显示为对应的时间。 我们就是采用的这种做法。 - 如果非要后端实现,那就要自己写一个
com.alibaba.fastjson2.filter.ValueFilter的实现,自己对输出的属性值进行自定义处理。例如 :public static class ZonedDateFormatFilter implements ValueFilter { // 直接引用该静态实例,避免每次调用都创建实例 public static final ZonedDateFormatFilter instance = new ZonedDateFormatFilter(); @Override public Object apply(Object object, String name, Object value) { if (value instanceof Date date) { // 通过请求上下文获取当前请求的时区,并进行对应的日期格式化 return "格式化的字符串"; } return value; } } - 与 2 同理,自己根据不同的请求构造不同的
JSONWriter.Context,调用setZoneId()传入对应的时区标识 也是可以的。
JSONWriter.Context和JSONReader.Context都支持设置zoneId,比如:
JSONWriter.Context writeContext = JSONFactory.createWriteContext();
writeContext.setZoneId(ZoneId.of("Asia/Karachi"));
Date date = new Date();
String str = JSON.toJSONString(date, writeContext);
JSONReader.Context readContext = JSONFactory.createReadContext();
readContext.setZoneId(zoneId);
Date date1 = JSON.parseObject(str, Date.class, readContext);
收到,感谢两位的指导~
zoneId
可以在全局配置FastJsonConfig config = new FastJsonConfig();里面设置么