xxl-job icon indicating copy to clipboard operation
xxl-job copied to clipboard

DateUtil工具类格式化日子无法定制时区

Open cuisuqiang opened this issue 2 years ago • 1 comments

private static final ThreadLocal<Map<String, DateFormat>> dateFormatThreadLocal = new ThreadLocal<Map<String, DateFormat>>();
private static DateFormat getDateFormat(String pattern) {
    if (pattern==null || pattern.trim().length()==0) {
        throw new IllegalArgumentException("pattern cannot be empty.");
    }

    Map<String, DateFormat> dateFormatMap = dateFormatThreadLocal.get();
    if(dateFormatMap!=null && dateFormatMap.containsKey(pattern)){
        return dateFormatMap.get(pattern);
    }

    synchronized (dateFormatThreadLocal) {
        if (dateFormatMap == null) {
            dateFormatMap = new HashMap<String, DateFormat>();
        }
        dateFormatMap.put(pattern, new SimpleDateFormat(pattern));
        dateFormatThreadLocal.set(dateFormatMap);
    }

    return dateFormatMap.get(pattern);
}

直接使用new SimpleDateFormat(pattern),导致服务器时区和我们不一致时,无法按国内时间打印日志内容

修改建议 ` private static final ThreadLocal<Map<String, DateFormat>> dateFormatThreadLocal = new ThreadLocal<Map<String, DateFormat>>(); private static DateFormat getDateFormat(String pattern) { if (pattern==null || pattern.trim().length()==0) { throw new IllegalArgumentException("pattern cannot be empty."); }

    Map<String, DateFormat> dateFormatMap = dateFormatThreadLocal.get();
    if(dateFormatMap!=null && dateFormatMap.containsKey(pattern)){
        return dateFormatMap.get(pattern);
    }

    synchronized (dateFormatThreadLocal) {
        if (dateFormatMap == null) {
            dateFormatMap = new HashMap<String, DateFormat>();
        }
        SimpleDateFormat bjSdf = new SimpleDateFormat(pattern); // 北京
        bjSdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 设置北京时区
        dateFormatMap.put(pattern, bjSdf);
        dateFormatThreadLocal.set(dateFormatMap);
    }

    return dateFormatMap.get(pattern);
}`

指定为北京时区

cuisuqiang avatar Aug 16 '22 09:08 cuisuqiang

这个不合理感觉,万一别人的服务同样部署在非北京时区的,且逻辑就是需要取当前服务器的时间呢?

这个感觉更适合做一个自行实现的逻辑,默认取本机,然后可定制时区的。

guohui-ma avatar Aug 29 '22 03:08 guohui-ma

就不应该格式化,返回毫秒值

gMan1990 avatar May 19 '23 04:05 gMan1990