栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021110701-java前后台传递时间对象相差8个小时的时区问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021110701-java前后台传递时间对象相差8个小时的时区问题

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小时的时间差问题

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/445866.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号