这里主要解决的是log配置文件引起的时间不一致问题
其中是因为配置日志输出格式时使用了这种配法引起的
%d{yyyy-MM-dd HH:mm:ss,SSS}
逗号分隔两部分配置,其中前面第一个配置是时间格式
yyyy-MM-dd HH:mm:ss
后面第二个配置是时区的配置,因为这里配置的是SSS,不是有效的时区配置,所以用系统默认的时区配置,配置错误时系统就使用GMT,但是我们使用的是GMT+8,所以日志输出会少8个小时
SSS
解决办法是不配置后面的时区,不配置的时候会拿当前地区时区配置,所以不配置也是正确的,或者使用正确的时区配置
%d{yyyy-MM-dd HH:mm:ss}
或者
%d{yyyy-MM-dd HH:mm:ss,CTT}
CTT 是指上海的时间,具体可查看jdk中 ZoneId 这个类,其中就有各个地方的时区名字,
源码如下
public static final Map<String, String> SHORT_IDS;
static {
Map<String, String> map = new HashMap<>(64);
map.put("ACT", "Australia/Darwin");
map.put("AET", "Australia/Sydney");
map.put("AGT", "America/Argentina/Buenos_Aires");
map.put("ART", "Africa/Cairo");
map.put("AST", "America/Anchorage");
map.put("BET", "America/Sao_Paulo");
map.put("BST", "Asia/Dhaka");
map.put("CAT", "Africa/Harare");
map.put("CNT", "America/St_Johns");
map.put("CST", "America/Chicago");
map.put("CTT", "Asia/Shanghai");
map.put("EAT", "Africa/Addis_Ababa");
map.put("ECT", "Europe/Paris");
map.put("IET", "America/Indiana/Indianapolis");
map.put("IST", "Asia/Kolkata");
map.put("JST", "Asia/Tokyo");
map.put("MIT", "Pacific/Apia");
map.put("NET", "Asia/Yerevan");
map.put("NST", "Pacific/Auckland");
map.put("PLT", "Asia/Karachi");
map.put("PNT", "America/Phoenix");
map.put("PRT", "America/Puerto_Rico");
map.put("PST", "America/Los_Angeles");
map.put("SST", "Pacific/Guadalcanal");
map.put("VST", "Asia/Ho_Chi_Minh");
map.put("EST", "-05:00");
map.put("MST", "-07:00");
map.put("HST", "-10:00");
SHORT_IDS = Collections.unmodifiableMap(map);
}
所以总结来说就是不配置时是正确的,配置错误就使用GMT,配置了存在的时区就使用配置的。
系统默认的是当地时区,当然可以修改这个,在java bean 中加入这个静态代码块,spring在加载bean的时候就会执行这一段代码,就可以修改系统默认的时区。
在log配置文件中不配置时区的话会生效,否则这个静态代码的效果会被log日志配置覆盖
static {
TimeZone.setDefault(TimeZone.getTimeZone("CTT"));
}
网友评论