失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 110701-java前后台传递时间对象相差8个小时的时区问题

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

时间:2021-01-19 21:47:59

相关推荐

110701-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小时,之后再格式化输出日期的字符串形式

为什么中国标准时间 (北京)是Asia/Shanghai,而不是 Asia/BeiJing 时区?

因为1949年以前,中国一共分了5个时区,以哈尔滨、上海、重庆、乌鲁木齐和喀什为代表——分别是:长白时区GMT+8:30、中原标准时区 GMT+8、陇蜀时区GMT+7、新藏时区GMT+6和昆仑时区GMT+5:30。它是19北京观象台制订,后由内政部批准过。

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:ssspring.jackson.time-zone=GMT+8

date-format指定date输出格式为yyyy-MM-dd HH:mm:ss

time-zone指定时区,解决8小时的时间差问题

如果觉得《110701-java前后台传递时间对象相差8个小时的时区问题》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。