Java时区相关

时间格式

UTC是以原子时计时,更加精准,适应现代社会的精确计时。不过一般使用不需要精确到秒时,视为等同。GMT是前世界标准时,UTC是现世界标准时。每年格林尼治天文台会发调时信息,基于UTC。

GMT和 UTC可以视为几乎是等同的,UTC更精准,有闰秒的概念。

//世界标准时间UTC,其中T表示时分秒的开始(或者日期与时间的间隔),Z表示这是一个世界标准时间

String utcStr = "2010-10-12T15:24:22Z";

//本地时间,也叫不含时区信息的时间,末尾没有Z

String localStr = "2010-10-12T15:24:22";

//含有时区的时间,+08:00表示该时间是由世界标准时间加了8个小时得到的,[Asia/Shanghai]表示时区

String zoneStr = "2017-12-13T09:47:07.153+08:00[Asia/Shanghai]";

表示时间相关的类

表示时间的类主要有个:String、Instant、LocalDateTime、ZonedDateTime,

String是字符串形式的时间,Instant是时间戳,LocalDateTime是不含时区信息的时间,ZonedDateTime是含有时区信息的时间。

LocalDateTime

符合格式的String 可以直接转换为LocalDateTime

System.out.println(LocalDateTime.parse("2019-12-15 10:10:10", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

LocalDateTime字面意思是本地时间,实际上它可以理解为不含时区信息的时间,只储存了年月日时分秒,要表达是哪里的时间需要时区解释。

Instant与ZonedDateTime

Instant是时间戳,是指世界标准时格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,Instant本身已经携带了时区信息,默认是0时区。

ZonedDateTime是含有时区信息的时间,可以理解为它是Instant的格式化对象,

JDK 8以前的时区是用TimeZone,TimeZone ID是在java里ZoneInfoFile类加载的。在jvm初始化的时候,会读取jdk安装目录下的 ${ java.home } /jre/lib/tzdb.dat,放到其成员变量为zones的ConcurrentHashMap里。当调用TimeZone.getTimeZone(id)方法时,会用id到这个map里进行匹配获取到指定id的时区。其中TimeZone.getTimeZone("Asia/Shanghai")和TimeZone.getTimeZone("GMT+8")是相同的,可以相互替换使用。

System.out.println(ZonedDateTime.ofInstant(Instant.now(),ZoneId.systemDefault()).toInstant());

System.out.println(ZonedDateTime.ofInstant(Instant.now(),"Australia/Darwin").toInstant());

相同的Instant,在不同的时区有不同的展示时间,所以在用Instant构造ZonedDateTime的时候需要传入时区;ZonedDateTime可以直接转化为Instant,并且不同的ZonedDateTime可能会生成同样的Instant

时区转换

用户输入的String类型的时间是没有时区信息的,需要人为指定时区再解析。

解析的步骤分2步: 先确定用户时区

1.把用户输入的时间转化为世界标准时间;//Instant.parse("2010-10-12T15:24:22Z")

2.再把世界标准时间转为需要的时区的时间。//ZonedDateTime.ofInstant(instant,ZoneId.systemDefault());

不同地区的服务器统一时间的解决方案

首先后端封装一个接口后获取服务器相对GMT(格林尼治标准时间)时间的偏移量:

TimeZone zone = TimeZone.getDefault();

System.out.println(zone.getRawOffset());

这段代码放在不同时区的服务器上执行结果会不同(前提是服务器的时区设置跟本地时区一致)。如果在泰国执行结果为25200000ms,换算成小时为7,说明泰国的时区的偏移量相对于GMT标准时间相差7小时。下文简称“时区偏移量”。

前端首先调用该接口获取服务器的时区偏移量,再在浏览器上获取本地的时区偏移量,计算出两个偏移量的差值。本地浏览器上获取当前的时间戳,减去上一步计算出来的差值即可得到服务器这个时间的时间戳,把这个时间戳传给后端 再转换成时间,就是服务器对应的时间,存入数据库即可。

前端:

//服务的时区偏移量,通过接口获得,注意换成负值

var serveroffset=-25200000;

var d = new Date();

//获取本地浏览器的时区偏移量

var localOffset = d.getTimezoneOffset() * 60000;

//的到本地和偏移量的差值

var deffoffset=localOffset-(serveroffset);

//获取本地浏览器时间戳

var localTime = d.getTime();

//计算出传到服务器的时间戳

var servertime=localTime+deffoffset;

通过上述方式,可以实现服务器全球各地部署,系统都可以正常使用。

java时区问题_Java时区问题相关推荐

  1. java时区_Java时区

    java时区 Java TimeZone class represents a time zone offset, and also figures out daylight savings. Tim ...

  2. java对世界各个时区(TimeZone)的通用转换处理方法

    2019独角兽企业重金招聘Python工程师标准>>> 关于如何知道客户所在的时区,可以根据客户所在的ip或者用户注册提供的国家来计算出所在的时区. package cn.telep ...

  3. Java Calendar如何设置时区呢?

    转自: Java Calendar如何设置时区呢? 下文讲述使用Calendar类设置时区的方法分享,如下所示: 实现思路:1.使用TimeZone设置相应的时区2.使用Calendar类中的setT ...

  4. JAVA所用到的时区

    JAVA所用到的时区 Etc/GMT+12 Etc/GMT+11 MIT Pacific/Apia Pacific/Midway Pacific/Niue Pacific/Pago_Pago Paci ...

  5. java utc 转换pst_时区时差换算(GMT,UTC,PST,PDT)

    2014年美国冬令时标准时间Stardand Time于11月2号开始实施,直到2015年3月8号为止. 冬令时,是指在冬天使用的标准时间.在使用日光节约时制(夏令时)的地区,夏天时钟拨快一小时,冬天 ...

  6. ubuntu修改系统时区和jvm时区

    比喻我希望服务器是西太平洋时间 tzselect 在弹出框依次选择 Pacific Ocean > US ... cp /usr/share/zoneinfo/America/Los_Angel ...

  7. java拆分日期_java实现日期拆分的方法

    java实现日期拆分的方法 本文实例讲述了java实现日期拆分的方法.分享给大家供大家参考.具体如下: 如:计算6-1至6-5之间的日期天数及具体日期,预期的结果是得到: 6-1 6-2 6-3 6- ...

  8. java 时间类_Java日期和时间类简介

    Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...

  9. java 公元前时间_Java日期和时间类简介

    Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...

最新文章

  1. 【CSS3教程】CSS3基础常用技巧实例集合
  2. TiDB与gRPC的那点事
  3. 【Amazon 必考】Amazon Leadership Principles 亚马逊领导力准则
  4. 自定义状态栏notification布局
  5. 数据结构Java实现03----单向链表的插入和删除b
  6. STM32的USART中断死循环,形成死机。
  7. iOS屏幕尺寸和分辨率了解
  8. C++学习之路 | PTA乙级—— 1016 部分A+B (15分)(精简)
  9. javascript基础修炼——手把手教你造一个简易的require.js
  10. 并发编程学习之ForkJoinPool分支合并
  11. Layui实现Eharts图表
  12. 【XSY3331】东非大裂谷(结论,DP)
  13. 【修复收藏功能、更新登录接口】知识付费小程序、博客小程序、完整版开源源码、资源变现小程序
  14. 112-RTKLIB中关于dcb文件读取的问题
  15. python atm银行取款系统_python ATM机 案例代码
  16. 在微信小程序中将获取到的经纬度(经度纬度)转地址(地名)
  17. “独享宽带”是什么意思?
  18. 中文分词jieba python 学习
  19. 求助!编写 sql 语句,输出符合条件的查询结果。
  20. C++的throw抛出异常机制

热门文章

  1. JavaScript 跳格子游戏
  2. Mac系统打不开appstore怎么办
  3. 谷歌大脑团队任意图像风格化迁移论文详解,模型还可以跑在您本地浏览器里...
  4. MATLAB 神经网络模板
  5. 前端基础进阶(十三):透彻掌握Promise的使用,读这篇就够了
  6. 机器人总动员主角简笔画_机器人总动员简笔画
  7. 数据库 - 建模:实体关系图(ERD)
  8. hdu 2066 一个人的旅行(最短路)
  9. 计算机网络 网际控制报文协议 ICMP
  10. 怎么用英语推销小型计算机,关于推销电脑英语对话