1、问题:从postgresql获取时间,展示在前台时间不一致,相差8小时。
原因是什么么?
SpringMVC内置的JSON解析器是jackson解析器,JOSN解析器有jackson、fastsjon、jsonlib、gojson。jsackson转换的时候时区和国内默认相差8h,因此在时间换算上相差8小时。
2、什么是时区?
时区(Time Zone)是地球上的区域使用同一个时间定义。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。
Date:
TimeZone对象给我们的是原始的偏移量,也就是与GMT相差的微秒数,Java的Date对象里面存储着当前时刻到1970年1月1日0:00所经过的毫秒数,它与时区和地域没有关系(其实可以认为是GMT时间)计算机内部记录的时间(Date date = new Date()), 为格林威治标准时(GMT). 即java.util.Date代表一个时间点,其值为距公元1970年1月1日 00:00:00的毫秒数,所以它可以认为是没有时区和Locale概念的。
DateFormatter:
日期格式化类DateFormat, 对于不同地区的配置一般有两个点, 一个是Locale , 一个是TimeZone
前者(Locale)使DateFormat按所配置的地区特性来输出文字(例如中国,美国,法国不同地区对日期的表示格式不一样,中国可能是2001年10月5日)后者(TimeZone)让DateFormat知道怎么去转换,去调整时间偏移度,从而得到符合配置的时区的时间.假设当前时区为GMT+0,取得当前时间为2:00, 那么如果你配置DateFormat.setTimeZome("GMT+8"), 即北京时间的时区, 那么这时候格式化输出的就是10:00了, 因为系统对原始毫秒数进行了时间偏移调整(调到你设置的时区),即加多8小时,之后再格式化输出日期的字符串形式
| 时区 | 中文名称 |
| Pacific/Majuro | 马朱罗 |
| Pacific/Midway | 中途岛 |
| Pacific/Honolulu | 檀香山 |
| America/Anchorage | 安克雷奇 |
| America/Los_Angeles | 美国太平洋时间 (洛杉矶) |
| America/Tijuana | 美国太平洋时间 (提华纳) |
| America/Phoenix | 美国山区时间 (凤凰城) |
| America/Chihuahua | 奇瓦瓦 |
| America/Denver | 美国山区时间 (丹佛) |
| America/Costa_Rica | 美国中部时间 (哥斯达黎加) |
| America/Chicago | 美国中部时间 (芝加哥) |
| America/Mexico_City | 美国中部时间 (墨西哥城) |
| America/Regina | 美国中部时间 (里贾纳) |
| America/Bogota | 哥伦比亚时间 (波哥大) |
| America/New_York | 美国东部时间 (纽约) |
| America/Caracas | 委内瑞拉时间 (加拉加斯) |
| America/Barbados | 大西洋时间 (巴巴多斯) |
| America/Manaus | 亚马逊标准时间 (马瑙斯) |
| America/Santiago | 圣地亚哥 |
| America/St_Johns | 纽芬兰时间 (圣约翰) |
| America/Sao_Paulo | 圣保罗 |
| America/Argentina/Buenos_Aires | 布宜诺斯艾利斯 |
| America/Godthab | 戈特霍布 |
| America/Montevideo | 乌拉圭时间 (蒙得维的亚) |
| Atlantic/South_Georgia | 南乔治亚 |
| Atlantic/Azores | 亚述尔群岛 |
| Atlantic/Cape_Verde | 佛得角 |
| Africa/Casablanca | 卡萨布兰卡 |
| Europe/London | 格林尼治标准时间 (伦敦) |
| Europe/Amsterdam | 中欧标准时间 (阿姆斯特丹) |
| Europe/Belgrade | 中欧标准时间 (贝尔格莱德) |
| Europe/Brussels | 中欧标准时间 (布鲁塞尔) |
| Europe/Sarajevo | 中欧标准时间 (萨拉热窝) |
| Africa/Windhoek | 温得和克 |
| Africa/Brazzaville | 西部非洲标准时间 (布拉扎维) |
| Asia/Amman | 东欧标准时间 (安曼) |
| Europe/Athens | 东欧标准时间 (雅典) |
| Asia/Beirut | 东欧标准时间 (贝鲁特) |
| Africa/Cairo | 东欧标准时间 (开罗) |
| Europe/Helsinki | 东欧标准时间 (赫尔辛基) |
| Asia/Jerusalem | 以色列时间 (耶路撒冷) |
| Europe/Minsk | 明斯克 |
| Africa/Harare | 中部非洲标准时间 (哈拉雷) |
| Asia/Baghdad | 巴格达 |
| Europe/Moscow | 莫斯科 |
| Asia/Kuwait | 科威特 |
| Africa/Nairobi | 东部非洲标准时间 (内罗毕) |
| Asia/Tehran | 伊朗标准时间 (德黑兰) |
| Asia/Baku | 巴库 |
| Asia/Tbilisi | 第比利斯 |
| Asia/Yerevan | 埃里温 |
| Asia/Dubai | 迪拜 |
| Asia/Kabul | 阿富汗时间 (喀布尔) |
| Asia/Karachi | 卡拉奇 |
| Asia/Oral | 乌拉尔 |
| Asia/Yekaterinburg | 叶卡捷林堡 |
| Asia/Calcutta | 加尔各答 |
| Asia/Colombo | 科伦坡 |
| Asia/Katmandu | 尼泊尔时间 (加德满都) |
| Asia/Almaty | 阿拉木图 |
| Asia/Rangoon | 缅甸时间 (仰光) |
| Asia/Krasnoyarsk | 克拉斯诺亚尔斯克 |
| Asia/Bangkok | 曼谷 |
| Asia/Shanghai | 中国标准时间 (北京) |
| Asia/Hong_Kong | 香港时间 (香港) |
| Asia/Irkutsk | 伊尔库茨克时间 (伊尔库茨克) |
| Asia/Kuala_Lumpur | 吉隆坡 |
| Australia/Perth | 佩思 |
| Asia/Taipei | 台北时间 (台北) |
| Asia/Seoul | 首尔 |
| Asia/Tokyo | 日本时间 (东京) |
| Asia/Yakutsk | 雅库茨克时间 (雅库茨克) |
| Australia/Adelaide | 阿德莱德 |
| Australia/Darwin | 达尔文 |
| Australia/Brisbane | 布里斯班 |
| Australia/Hobart | 霍巴特 |
| Australia/Sydney | 悉尼 |
| Asia/Vladivostok | 海参崴时间 (符拉迪沃斯托克) |
| Pacific/Guam | 关岛 |
| Asia/Magadan | 马加丹时间 (马加丹) |
| Pacific/Auckland | 奥克兰 |
| Pacific/Fiji | 斐济 |
| Pacific/Tongatapu | 东加塔布 |
为什么中国标准时间 (北京)是Asia/Shanghai,而不是 Asia/BeiJing 时区?
因为1949年以前,中国一共分了5个时区,以哈尔滨、上海、重庆、乌鲁木齐和喀什为代表——分别是:长白时区GMT+8:30、中原标准时区 GMT+8、陇蜀时区GMT+7、新藏时区GMT+6和昆仑时区GMT+5:30。它是1912年北京观象台制订,后由内政部批准过。
3、解决办法
A.在Model时间字段上加注解
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date createTime; //创建时间
@JsonFormat用于输出的时候解析,并且设置解析时区,解决8小时时间差问题
@DateTimeFormat用于接收 前端传的时间值自动转换 可以是Date 可以是string 注意 格式要一样 如yyyy-MM-dd HH:mm:ss
B.在配置文件中进行配置.yml或者.properties配置文件
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8
date-format指定date输出格式为yyyy-MM-dd HH:mm:ss
time-zone指定时区,解决8小时的时间差问题



