在程序开发中会因为时区的不同,会发生时间类型的数据出现问题。记录@JsonFormat 注解在使用过程中应该注意的问题。
文章目录
时区概述
GMT:Greenwich Mean Time 格林尼治标准时间。这是以英国格林尼治天文台观测结果得出的时间,这是英国格林尼治当地时间,这个地方的当地时间过去被当成世界标准的时间。
UT:Universal Time 世界时。根据原子钟计算出来的时间。
UTC:Coordinated Universal Time 协调世界时。因为地球自转越来越慢,每年都会比前一年多出零点几秒,每隔几年协调世界时组织都会给世界时+1秒,让基于原子钟的世界时和基于天文学(人类感知)的格林尼治标准时间相差不至于太大。并将得到的时间称为UTC,这是现在使用的世界标准时间。
协调世界时不与任何地区位置相关,也不代表此刻某地的时间,所以在说明某地时间时要加上时区
也就是说GMT并不等于UTC,而是等于UTC+0,只是格林尼治刚好在0时区上。
GMT = UTC+0
中国的默认时区
中国的默认时区是东八区
TimeZone获得本地时区
实现代码
package cn.wideth.util;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) {
//获得当前的默认时区
TimeZone timeZone = TimeZone.getDefault();
System.out.println(timeZone);
}
}
运行结果
格林尼治时间(GMT)、世界协调时间(UTC)和中国时间的关系
中国时间(Asia/Shanghai) = 格林尼治时间(GMT) + 8
格林尼治时间(GMT) = 世界协调时间(UTC) + 0
package cn.wideth.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class TimeZoneTest {
public static void main(String[] args) {
//中国的默认时区,东八区,默认为Asia/Shanghai
TimeZone tz = TimeZone.getDefault();
System.out.println(tz.getID());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimeZone timeZone = TimeZone.getTimeZone(tz.getID());
simpleDateFormat.setTimeZone(timeZone);
System.out.println(simpleDateFormat.format(new Date()));
//东八区的时间 = 格林尼治时间 + 8
TimeZone timeZone2 = TimeZone.getTimeZone("GMT+8");
simpleDateFormat.setTimeZone(timeZone2);
System.out.println(simpleDateFormat.format(new Date()));
System.out.println("-------------------------------------");
//格林尼治时间(GMT)。GMT = UTC+0
TimeZone timeZone3 = TimeZone.getTimeZone("GMT");
simpleDateFormat.setTimeZone(timeZone3);
System.out.println(simpleDateFormat.format(new Date()));
//世界协调时间(UTC),世界标准时间(美国时间)
TimeZone timeZone4 = TimeZone.getTimeZone("UTC");
simpleDateFormat.setTimeZone(timeZone4);
System.out.println(simpleDateFormat.format(new Date()));
}
}
运行结果
Locale获得每个国家的语言简称
package cn.wideth.util;
import java.util.Locale;
/**
* java来获得全球国家
* 名称,语言和简称
*/
public class LocaleTest {
public static void main(String[] args) {
//获得中国的简称,默认为语言简称
Locale l = Locale.getDefault();
Locale[] locales = Locale.getAvailableLocales();
for(int i = 0, len = locales.length; i < len; i++){
StringBuffer sb = new StringBuffer();
sb.append("中文名称:").append(locales[i].getDisplayCountry()).append(" -- 简称:").
append(locales[i].getCountry()).append(" -- 语言简称:").append(locales[i].toString());
System.out.println(sb.toString());
}
}
}
运行结果
@JsonFormat注解用法
@JsonFormat 用来表示json序列化的一种格式或者类型,主要有下面几个常用的属性
@JsonFormat(shape = JsonFormat.Shape.ANY,locale = "zh_CN",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT")
private Date date;
shap: 表示序列化后的一种类型,默认为JsonFormat.Shape.ANY
pattern: 表示日期的格式,默认为序列化以后的格式,比如:2020-09-08T15:19:09.000+00:00
timezone: 默认是GMT,中国需要GMT+8
locale: 根据位置序列化的一种格式,默认为本地的语言简称,中国的语言简称为zh_CN
注意:@JsonFormat注解默认的时区为格林尼治时间,比中国时间(东八区是要小8个小时的)。
程序中数据库时区的设置
本文小结
本文首先介绍了时区,中国时区,即东八区。格林尼治时间,世界协调时间。最后介绍了@JsonFormat注解的使用和用法,以及在使用过程中需要注意到的问题。