fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[QUESTION]Spring boot集成了FastJson2后,有没有什么好的方法动态处理时区

Open Jick-study opened this issue 2 years ago • 4 comments

请描述您的问题

由于项目中不同的用户有不同的时区,数据库里存的是0时区的时间。表里记录了某个用户选中的时区。前端处理遇到好多控件上的问题,有没有什么的好的方案后端返回数据的时候动态替换下时区呢~

Jick-study avatar Dec 25 '23 12:12 Jick-study

  1. 设置 JSON.configWriterDateFormat("millis") 让 Fastjson2 直接输出时间戳,时间戳是没有时区概念的,然后让前端将时间戳基于当地时区显示为对应的时间。 我们就是采用的这种做法。
  2. 如果非要后端实现,那就要自己写一个 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;
    	}
    
    }
    
  3. 与 2 同理,自己根据不同的请求构造不同的 JSONWriter.Context,调用 setZoneId() 传入对应的时区标识 也是可以的。

CodePlayer avatar Jan 05 '24 04:01 CodePlayer

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);

wenshao avatar Jan 06 '24 05:01 wenshao

收到,感谢两位的指导~

Jick-study avatar Jan 07 '24 01:01 Jick-study

zoneId

可以在全局配置FastJsonConfig config = new FastJsonConfig();里面设置么

scccy avatar May 28 '24 02:05 scccy