0、引言

Druid中时区的问题一直困扰着我们,所以我专门去研究了一下世界时区和Java中的时区,对使用Druid很用帮助.

1、UTC时间&GMT时间

UTC时间是时间标准时间(Universal Time Coordinated),UTC是根据原子钟来计算时间,误差非常小。

UTC也是指零时区的时间,如果要表示其他时区的时间,这里要注意没有UTC+0800或者UTC+8这样的表示方式(至少Java里面没有,一般用于口头表示),只有Asia/Shanghai这样的表示方式,详细的时区列表参考这个文档时区列表,不要问我为什么没有北京时区。。。

GMT时间是根据地球的自转和公转来计算时间,老的时间计量标准,这里我们不过多讨论

2、表达时间方式

我们一般表示时间都会带格式以方便理解,例如时间表达式是'2018-09-12 08:00:00',因为我们在东八区,所以默认是:北京时间2018年9月12号8点整。但是如果是一个美国人看到这个时间,就会认为是美国东部or西部时间的2018年9月12号8点整。所以从这种表达方式很不准确,因为没有指明到底是哪个时区的时间!!!!

所以准确的表达时间必须带有时区,例如2018-09-12 08:00:00+0800,表达了Asia/Shanghai这个时区的时间2018年9月12号8点整。这里要注意+0800并不是表示加8小时的意思,只是表示这个时间'2018-09-12 08:00:00'是东八区Asia/Shanghai的时间,仅此而已。

3、UTC时间的时间戳

讲清楚了时间表达方式,再讲时间戳。其实时间戳是没有时区概念的,或者说时间戳只能是0时区的。时间戳是从1970-01-11 00:00:00+0000开始的(原因大家都知道),也就是在'1970-01-11 00:00:00+0000'这个时间点,时间戳是0。再换句话说在'1970-01-11 08:00:00+0800'时间戳也是0。这也是Java里时间组件的默认方式,不管用户输入的人类可识别的时间是什么格式,在内部统一存的是时间戳。

例如时间是'2018-09-01 08:00:00+0800',那么使用date.getTime()获取到时间戳是1535760000000;时间是'2018-09-01 00:00:00+0000',获取到时间戳也是1535760000000。

测试代码如下:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");

System.out.println(sdf.parse("2018-09-01 08:00:00+0800").getTime());

System.out.println(sdf.parse("2018-09-01 00:00:00+0000").getTime());

可以观察到这2行代码的输出都是1535760000000,这就证明了上面的观点。再啰嗦2点:

第一行代码DateFormat中Z表示时区,所以String类型格式时间带上+0800这种表达式,就能正确获取时间戳了。

SimpleDateFormat是线程不安全的,不要用

4、时区设置

为什么我们写以下代码的时候,程序能正确知道我们的时区呢?

SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println(sdf2.parse("2018-09-01 08:00:00").getTime());

因为我们在mac上设置了时区

在Java中也可以设置时区

1)启动设置

java -Duser.timezone=Asia/Shanghai -jar xxx.jar

代码中设置

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println(sdf.parse("2018-09-01 08:00:00").getTime());

单次处理生效,建议使用joda的时间包

joda-time

joda-time

2.9.9

DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withChronology(ISOChronology.getInstance(DateTimeZone.forID("Asia/Shanghai")));

System.out.println(dateTimeFormatter.parseDateTime("2018-09-01 08:00:00").getMillis());

java 获取系统时间 8小时 jre_Java获取时间与系统时间相差8小时终极解决方案相关推荐

  1. java joda 获取utc时间_Java获取时间与系统时间相差8小时终极解决方案

    0.引言 Druid中时区的问题一直困扰着我们,所以我专门去研究了一下世界时区和Java中的时区,对使用Druid很用帮助. 1.UTC时间&GMT时间 UTC时间是时间标准时间(Univer ...

  2. java 8小时_Java获取时间与系统时间相差8小时终极解决方案

    0.引言 Druid中时区的问题一直困扰着我们,所以我专门去研究了一下世界时区和Java中的时区,对使用Druid很用帮助. 1.UTC时间&GMT时间 UTC时间是时间标准时间(Univer ...

  3. java 半小时_java获取当前时间加半小时之后的时间

    java获取当前时间加半小时之后的时间: 1.获取当前时间,获取到的时间类型是long类型的,单位是毫秒 long currentTime = System.currentTimeMillis() ; ...

  4. java获取时间相差8小时的问题及解决方式

    三种时间差错问题: java下使用new date()获取的时间会和真实的本地时间相差8小时. 本地获取的时间没有错,存入数据库的时候时间相差8小时. 数据库时间没有错,获取到了后端,之后返回给前端相 ...

  5. java 当前时间戳_通过各种方法 获取当前系统时间、时间戳

    php中,如何通过各种方法 获取当前系统时间.时间戳,并备注各种格式的含义,可灵活变通. 1.获取当前时间方法date() 很简单,这就是获取时间的方法,格式为:date($format, $time ...

  6. java怎么将时间格式化输出_Java获取时间日期并格式化输出

    Java获取当前系统时间.自定义时间和日期格式化输出部分应用总结 1.java获取当前时间,并格式化输出,如2018-12-01 11:20:11 // 获取当前时间,并格式化输出,如2018-12- ...

  7. java获取mysql时间格式化_Java与mysql的时间格式化问题,获取时间的上下午

    Java与mysql的时间格式化问题,获取时间的上下午java 在项目中常常会遇到对时间进行格式化的问题,一次在对应用中发现,使用Java的SimpleDateFormat格式化时间,获取到的是上午, ...

  8. oracle中怎么获取系统时间,Oracle中如何获取系统当前时间

    Oracle中如何获取系统当前时间 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; ORACLE里获取一个时间的年.季.月.周.日 ...

  9. 解决.net6 Docker容器 DateTime.Now 获取时间相差8小时问题

    2022.09.30 补充说明 在容器构建阶段指定时区是更靠谱且更有效的处理方式,如果方便删除原有容器重新构建新的容器,在构建命令中写入以下配置语句: -e TZ=Asia/Shanghai 若不方便 ...

最新文章

  1. 双绞线是计算机网络的一种通信线路吗,计算机网络环境的信道传输技术分析
  2. aka名字_她叫李清照,没有AKA,这是她的专访//关于“天赋”二字,她说……
  3. 在内存只有 24KB 的电脑上写操作系统,是怎样的体验?
  4. k2677场效应管参数引脚_场效应管参数大全2.doc
  5. python_day21面向对象的进阶(反射,内置方法,)
  6. java基础提升篇:深入浅出Java多线程
  7. mysql操作语句now_【MySQL数据库开发之二】MySQL 基础语句的书写与操作!
  8. 无招胜有招之Java进阶JVM(六)JVM 参数及调优
  9. 发那科攻丝回退参数_乐享:发那科MF选配功能诊断小结
  10. SendMessage
  11. Android 8.0 学习(3)---Android Treble
  12. 对开源库 limdu 命令注入漏洞 (CVE-2020-4066) 的简要分析
  13. 数论-某寒假训练赛 Round1 (Feb, 2018)
  14. Mysql之查询基础select
  15. 图像直方图均衡 matlab,图像直方图均衡化
  16. uiuc大学计算机排名2019,2019年QS世界大学排名伊利诺伊大学香槟分校排名第71
  17. PTA 7-114 用if-else语句编程百分制成绩转换为五分制成绩
  18. 步骤分解:教你五步实现css转盘抽奖小游戏
  19. 游戏贴图打包工具——TexturePacker详解
  20. 如何通过OPENROWSET函数向SQL Server导入带工作组(mdw)保护的Access数据库数据(转)...

热门文章

  1. 【渝粤教育】电大中专测量学 (5)作业 题库
  2. bloomfilter的java实现,BloomFilter(布隆过滤器)原理及实战详解
  3. 计算机模拟技术在教学上的应用,计算机模拟技术在水利工程学科试验教学中的应用...
  4. 解神者php奥义高阶,《解神者》角色月曦九攻略技能解析和兽主推荐
  5. QPSK信号调制之ASCII码
  6. 建立时间、保持时间与亚稳态
  7. matlab评估边缘检测性能,【模糊推理】模糊逻辑图像边缘检测,原理+matlab代码~...
  8. 系统间账号认证系统同步方案
  9. 20190608笔试题のCSS-属性继承
  10. 如何为你的博客园添加到百度统计