java时区问题_Java时区问题
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时区问题相关推荐
- java时区_Java时区
java时区 Java TimeZone class represents a time zone offset, and also figures out daylight savings. Tim ...
- java对世界各个时区(TimeZone)的通用转换处理方法
2019独角兽企业重金招聘Python工程师标准>>> 关于如何知道客户所在的时区,可以根据客户所在的ip或者用户注册提供的国家来计算出所在的时区. package cn.telep ...
- Java Calendar如何设置时区呢?
转自: Java Calendar如何设置时区呢? 下文讲述使用Calendar类设置时区的方法分享,如下所示: 实现思路:1.使用TimeZone设置相应的时区2.使用Calendar类中的setT ...
- JAVA所用到的时区
JAVA所用到的时区 Etc/GMT+12 Etc/GMT+11 MIT Pacific/Apia Pacific/Midway Pacific/Niue Pacific/Pago_Pago Paci ...
- java utc 转换pst_时区时差换算(GMT,UTC,PST,PDT)
2014年美国冬令时标准时间Stardand Time于11月2号开始实施,直到2015年3月8号为止. 冬令时,是指在冬天使用的标准时间.在使用日光节约时制(夏令时)的地区,夏天时钟拨快一小时,冬天 ...
- ubuntu修改系统时区和jvm时区
比喻我希望服务器是西太平洋时间 tzselect 在弹出框依次选择 Pacific Ocean > US ... cp /usr/share/zoneinfo/America/Los_Angel ...
- java拆分日期_java实现日期拆分的方法
java实现日期拆分的方法 本文实例讲述了java实现日期拆分的方法.分享给大家供大家参考.具体如下: 如:计算6-1至6-5之间的日期天数及具体日期,预期的结果是得到: 6-1 6-2 6-3 6- ...
- java 时间类_Java日期和时间类简介
Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...
- java 公元前时间_Java日期和时间类简介
Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...
最新文章
- 【CSS3教程】CSS3基础常用技巧实例集合
- TiDB与gRPC的那点事
- 【Amazon 必考】Amazon Leadership Principles 亚马逊领导力准则
- 自定义状态栏notification布局
- 数据结构Java实现03----单向链表的插入和删除b
- STM32的USART中断死循环,形成死机。
- iOS屏幕尺寸和分辨率了解
- C++学习之路 | PTA乙级—— 1016 部分A+B (15分)(精简)
- javascript基础修炼——手把手教你造一个简易的require.js
- 并发编程学习之ForkJoinPool分支合并
- Layui实现Eharts图表
- 【XSY3331】东非大裂谷(结论,DP)
- 【修复收藏功能、更新登录接口】知识付费小程序、博客小程序、完整版开源源码、资源变现小程序
- 112-RTKLIB中关于dcb文件读取的问题
- python atm银行取款系统_python ATM机 案例代码
- 在微信小程序中将获取到的经纬度(经度纬度)转地址(地名)
- “独享宽带”是什么意思?
- 中文分词jieba python 学习
- 求助!编写 sql 语句,输出符合条件的查询结果。
- C++的throw抛出异常机制