Java 关于UTC时间戳

  • 结论
    • 起因和论证过程

结论

     System.out.println(" --------LocalDateTime------");System.out.println(LocalDateTime.now(ZoneOffset.UTC).toInstant(ZoneOffset.UTC).toEpochMilli());System.out.println(" --------+0------");System.out.println(LocalDateTime.now(ZoneOffset.UTC).toInstant(ZoneOffset.of("+0")).toEpochMilli());System.out.println(" --------utc时间------");Calendar cal = Calendar.getInstance();TimeZone tz = TimeZone.getTimeZone("GMT");cal.setTimeZone(tz);System.out.println(cal.getTimeInMillis());// 返回的UTC时间戳System.out.println(" --------Date getTime------");System.out.println(new Date().getTime());System.out.println(" --------Date getTime------");System.out.println(Calendar.getInstance().getTimeInMillis());

java常用时间戳都是相对于utc 1970-01-01T00:00:00 时间戳,(这样说可能有些别扭,主要用来区别不同时区),通过以上方法获取的毫秒值都是一样的。猜想Date Calendar 等时间对象核心都是存了一个UTC时间戳,但是转化为可见时间字符串的时候计算了时区偏移量。而我们平时理解 new Date() 是当前系统时间,因为是可看懂的部分,已经做了时区偏移。
补 https://www.utctime.net/utc-timestamp 在线UTC 时间戳,实际获取的时间戳可以与此对比。

起因和论证过程

项目需要用到UTC时间戳,让不同客户端在不同时区使用时间戳转换为当地时间。
本是很基础常用的的功能,在网上查却是方法复杂要计算偏移量和众说纷纭。
这里先贴一下我的代码

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;class Time {public static void main(String[] args) {System.out.println(" --------LocalDateTime------");System.out.println(LocalDateTime.now(ZoneOffset.UTC).toInstant(ZoneOffset.UTC).toEpochMilli());System.out.println(" --------+8------");System.out.println(LocalDateTime.now(ZoneOffset.UTC).toInstant(ZoneOffset.of("+8")).toEpochMilli());System.out.println(" --------+0------");System.out.println(LocalDateTime.now(ZoneOffset.UTC).toInstant(ZoneOffset.of("+0")).toEpochMilli());System.out.println(" --------utc时间------");Calendar cal = Calendar.getInstance();TimeZone tz = TimeZone.getTimeZone("GMT");cal.setTimeZone(tz);System.out.println(cal.getTimeInMillis());// 返回的UTC时间戳System.out.println(" --------Date getTime------");System.out.println(new Date().getTime());System.out.println(" --------Date getTime------");System.out.println(Calendar.getInstance().getTimeInMillis());}
}

运行即刻截图和网上时间戳工具比

https://www.utctime.net/utc-timestamp 在线UTC 时间戳

Date 有方法获取时间戳

 /*** Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT* represented by this <tt>Date</tt> object.** @return  the number of milliseconds since January 1, 1970, 00:00:00 GMT*          represented by this date.*/public long getTime() {return getTimeImpl();}

根据官方源码注释可见,此方法是获取相对于utc 1970-01-01T00:00:00 的毫秒值。
但是网上还有些说法说这个毫秒值是有当前时区属性的,按常理说我们常用的new Date() 方法是带有时区概念,所以有人理解这个毫秒值是时区属性的。 但是多想几个问题:
1.有没有听过不同时区的标准时间的起始时间,比如北京时间的时间戳是new Date().getTime()的毫秒值是相对于 北京时区 1970-01-01T00:00:00?每个时区的都同理取自 自己时区时间的 1970-01-01T00:00:00 ?这样的时间戳有什么意义
2.java源码注释java1.1版本开始的注释 就有问题?源码应该是我们最大的凭证
3.https://stackoverflow.com/questions/2403109/how-to-make-date-gettime-returns-utc-time/2404790#2404790

java.util.Date has no concept of timezone. It simply holds time relative to epoch, which is Jan 1 1970 00:00:00 UTC. Date is a model, separate from the view. When you display the date, the concept of timezone then is applied. Date’s toString() displays a human readable date in the default timezone. You can either use a DateFormat to display a Date in a different timezone (such as UTC), or change the JVM’s default timezone.
这里贴一下有道翻译,
java.util。日期没有时区的概念。它只是保存相对于epoch的时间,即UTC时间1970年1月1日00:00:00。Date是一个模型,与视图分离。在显示日期时,将应用时区的概念。Date的toString()以默认时区显示人类可读的日期。可以使用DateFormat在不同时区(如UTC)显示日期,也可以更改JVM的默认时区。

综上所述: date的getTime() 就是获取相对于UTC的时间戳,(同理:cal.getTimeInMillis()),时间戳就应该是一个相对于一个时区的标准时间, 如果有多个就没有参考意义了。我们常见的Date 是存了这样一个时间戳,不过输出成可看懂的形式时候,都加了偏移量,或者在格式化的位置处理了时间偏移。
我做了论证:
切换了时区 用Date().getTime() 打印

黑德兰 UTC +3:30
1602668209818
首尔 UTC/GMT +9
1602668243630
圣诞岛 UTC/GMT +11:
1602668295623
Date().getTime()如果有时区概念,就会相差若干小时,但是上面我测试得到 时间戳是一致的(中间有切换系统时间和运行代码的时间)

补充:
Date 我猜想getSecond()、getYear()、 getTimezoneOffset() 等获取具体时间值的废弃,可能都是想让这个date 这个对象更纯粹一点 不牵扯具体系统时间 时区。

有问题欢迎讨论

Java UTC时间戳相关推荐

  1. 用C语言将当前北京时间转换成UTC时间戳

    用C语言将当前北京时间转换成UTC时间戳 时间戳表示格式 UNIX时间戳 指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,不 ...

  2. java 生成时间戳

    java 生成时间戳 System.currentTimeMillis()

  3. NTP时间戳和UTC时间戳互转及其原理

    1.NTP时间戳 NTP时间戳是用一个64bit的无符号的定点数表示.它表示自从1900年1月1日00:00 到现在过了多少秒.64bit分为两部分,高32bit表示整数部分,单位是秒:低32bit表 ...

  4. java-UTC时间戳格式化成年月日,UTC时间戳转成北京时间并格式化年月日

    java-UTC时间戳格式化北京时间 一.时间戳定义 二.应用场景 1.UTC时间戳,格式化成年月日时分秒 2.UTC时间戳格式化年月日并转成北京时间的两种实现方式 三.总结 一.时间戳定义 1.UT ...

  5. java php 时间戳转日期_java时间戳转php时间戳

    java时间戳转php时间戳的方法:首先将java时间戳转成字符串,代码为[$utStr = $javaUt . '';]:然后如果java时间戳小于等于10位直接返回:最后截取并且转成整型即可. j ...

  6. java 除以1000_练习:将从表读出来的时间戳除以1000(java读时间戳会多出3个000)用jackson包 实现...

    练习:将从表读出来的时间戳除以1000(java读时间戳会多出3个000)jackson包 实现 entity @Entity @DynamicUpdate //自动更新日期 @Data //get/ ...

  7. java获取时间戳的三种方式比较

    文章目录 java获取时间戳的三种方式比较 java获取时间戳的三种方式比较 import java.util.Calendar; import java.util.Date; //不再推荐使用Dat ...

  8. java生成时间戳类型_Java获取当前时间戳的方法有哪些

    Java获取当前时间戳的方法有哪些 时间:2017-08-22     来源:华清远见JAVA学院 时间戳就是一种类型,只是精度很高,比datetime要精确的多,通常用来防止数据出现脏读现象.那么J ...

  9. java 获取时间戳 的三种方法

    java 获取时间戳 的三种方法,效率依次递减 方法一 : System.currentTimeMillis(); 方法二: new Date().getTime(); 方法三: Calendar.g ...

  10. Java 实现时间戳显示格式为几天前、几分钟前、几秒前及其应用

    以前后端返回一个 createTime 字段一般的处理方法就是直接前端展示就完事了. 例如百度贴吧: 最近要做一个评论回复功能,想着再直接展示 某人于 2020/3/6 16.42 回复@某某 就稍显 ...

最新文章

  1. 隐藏原生select下拉框的向下箭头▼
  2. PgSQL · 特性分析 · full page write 机制
  3. Python3学习笔记——类
  4. html标记表示超链接,HTML常见标签学习
  5. @RequestParam 绑定List参数
  6. void 类型的指针
  7. 安装配置tengine
  8. 一篇文章带你快速入门JavaScript(实操代码)
  9. 公司鼓励程序员不要加班,去约会!
  10. SPI-TOUCHP调试(2440a-wince5)
  11. 使用apktool来解包和重新打包
  12. 两种方式设置单元格的下划线
  13. 为资产分类定义折旧范围_SAP FICO零基础学习_0006_资产-概述和基本配置
  14. 计算机哪个是易失性存储器,易失性的存储器是什么?
  15. [原创]VC成功实现重启路由器(完整源码)
  16. python爬取起点vip小说章节_python 爬取qidian某一页全部小说
  17. Python + Scrapy 小小爬虫有大大梦想
  18. 自从IDEA配上这个插件开发速度快了N倍
  19. 【阿拉伯数字转中文汉字工具类】
  20. 7-1 约瑟夫环问题-hebust (10 分)

热门文章

  1. 微信公众号第三方平台授权流程
  2. 二手交易app manifest.xml
  3. lda指令是什么意思_汇编指令大全
  4. 【MC 网易-我的世界-mod开发基础笔记】 --- 常用的在线工具
  5. 工具类之十七 基于zxing的二维码生成工具类
  6. 用Python做数据分析之数据筛选及分类汇总
  7. Lazy evaluation
  8. Linux云计算学习笔记day56
  9. 阿里图标库彩色图标使用
  10. 机器学习基石 5.1 Recap and Preview