java system.currenttimemillis()-金沙1005

java system.currenttimemillis()_import java.util.scanner返回从1970年1月1日午夜(utc)开始到当前时间的毫秒值.

参考自:
在这里插入图片描述

方法功能:返回从1970年1月1日午夜(utc)开始到当前时间的毫秒值.

其中,需要特别说明的地方

1.午夜(midnight)指的时间是 0时0分0秒,utc表示该时间是0时区的时间
2.当前时间,不是指我们北京时间(utc 8,东八区)的当前时间,而是0时区的当前时间。

例如,你现在的时间是1970-01-01 08:00:01(utc 8),此刻0时区的时间是1970-01-01 00:00:01(utc),共经过了1秒,所以计算机中存储的毫秒值是1000。

unix系统把1970年1月1日 00:00:00 gmt(gmt也表示0时区含义)作为时间的开始,称为纪元。

当时,操作系统是32位的,综合考虑决定使用32位的有符号数存储时间。对于1970年1月1日 00:00:00 utc (等价我们的时间1970年1月1日 08:00:00 utc 8)在计算机中存储为0。

注意,在unix中存储的值的单位是秒,在java编程语言中的值的单位是毫秒。

用32位有符号能表示的最大值是01111111 11111111 11111111 11111111, 即214748367, 对应utc时间2038年1月19日3时14分7秒。过了这个时间点,时间会溢出并变成10000000 00000000 00000000 00000000,即-214748368,对应的utc时间1901年12月13日20时45分52秒,这样便会出现时间回归的现象,很多软件便会运行异常了。

要解决这个问题,最简单的方式是扩展unix时间的长度,用64位数字来表示它。64位二进制数的实际可用位数是63位。最大表示到公历的utc时间292277026596年12月4日。如果那个时候人类文明还存在的话。公元纪年很可能已经因为太难用而被抛弃了。理想的情况是到2038年, 64位系统已经成为主流,从而避免特意去修正这个问题所需要的大量开销。否则,人们就必须把新的64位时间拆分成两部分并分别保存在两个变量里,这是一个麻烦而且效率低下的选择。

许多操作系统和编程语言都是以unix为基础的,因此时间的起点,纪元通常和unix选定的1970年1月1日 00:00:00 gmt一致。

三、java中时间的表示

文章最开始就提到:时间是从1970年1月1日午夜(utc)开始到当前时间的毫秒值。

java中使用java.util.date保存该毫秒值。

使用指定的long类型的毫秒值作为参数,初始化date对象
在这里插入图片描述
默认构造函数使用当前时间的毫秒值初始化date对象
在这里插入图片描述

另外,我们可以看到返回值是long类型,在java中毫秒值是用64位存储的,不存在2038年的问题。

第一点,对于1970-01-01 00:00:01(utc),毫秒值应该是1000,那么java的实际存储值是1000吗?让我们来做个实验吧。


public static void main( string[] args ) throws exception { 
   
        simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss");
        // 设置时区0时区
        sdf.settimezone(timezone.gettimezone("gmt"));
        string source = "1970-01-01 00:00:01";
        date data = sdf.parse(source);
        system.out.println("0时区时间:"  source ", 保存的毫秒值:"  data.gettime());
    }
java system.currenttimemillis()_import java.util.scanner

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活clion
datagrip dataspell
dotcover dotmemory
dottrace goland
phpstorm pycharm
resharper reshac
rider rubymine
webstorm 全家桶

运行结果,和我们期待的一样:
在这里插入图片描述

第二点,我们的东八区北京时间1970-01-01 08:00:01(utc 8),存储值也是1000吗?注意,这里的时间是8小时0分1秒

    public static void main( string[] args ) throws exception { 
   
        simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss");
        // 设置时区为东八区
        sdf.settimezone(timezone.gettimezone("gmt 8"));
        string source = "1970-01-01 08:00:01";
        date data = sdf.parse(source);
        system.out.println("东八区时间:"  source ", 保存的毫秒值:"  data.gettime());
    }
}

运行结果如下图所示,验证了当前时间是指0时区的时间。

在这里插入图片描述

第三点,对于2038年1月19日3时14分7秒(utc),在unix32位系统中保存为int的最大值214748367(秒),那么在java的64位long类型中保存的值是214748367 * 1000 = 2147483671000毫秒吗?

     public static void main( string[] args ) throws exception { 
   
        simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss");
        // 设置时区0时区
        sdf.settimezone(timezone.gettimezone("gmt"));
        string source = "2038-01-19 03:14:07";
        date data = sdf.parse(source);
        system.out.println("0时区时间:"  source ", 保存的毫秒值:"  data.gettime());
        system.out.println("int最大值*1000:"  (long)integer.max_value * 1000);
    }

运行结果,也和我们期待的一致

在这里插入图片描述


参考文章列表: 【[关于1970-1-1 00:00.000的知识](https://blog.csdn.net/tianzizhi/article/details/4547373) 】
js555888金沙老品牌的版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由思创斯整理,转载请注明出处:https://ispacesoft.com/141813.html

(0)

相关推荐

  • 多线程java面试题_java多线程是并发还是并行前言 进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。 线程:表示程序的执行流程,是cpu调度执行的基本单位;线程有自己的程序计数器、寄存器、堆栈和帧。同一进 …

  • java hmacsha1 加密解密publicstaticlonggenhmac(byte[]data,stringkey){byte[]result=newbyte[8];longvalue=0;try{//根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称secretkeyspecsigninkey=newsec…

  • java实现无锁队列okimportjava.util.random;importjava.util.concurrent.executorservice;importjava.util.concurrent.executors;importjava.util.concurrent.timeunit;importjava.util.concurrent.atomic.atomicinteger;importjava.util.concurrent.atomic.atomicreference;/

  • java-xml[亲测有效]java-xml

  • java–数组和集合区别「建议收藏」博主之前是做移动端ios开发的发现一直有一个疑问,比如java中数组

    2022年12月30日
  • java进阶 | io流核心模块与基本原理io技术在jdk中算是极其复杂的模块,其复杂的一个关键原因就是io操作和系统内核的关联性,另外网络编程,文件管理都依赖io技术,而且都是编程的难点,想要整体理解io流,先从linux操作系统开始。io

  • java判断list是否为空_java如何判断list是否为空?[通俗易懂]java判断集合list是否为空的方法:如果想判断list是否为空,可以这么判断:if(list==null||list.size()==0){//为空的情况}else{//不为空的情况}list.isempty()和list.size()==0的区别答案:没有区别。isempty()判断有没有元素,而size()返回有几个元素,如果判断一个集合有无元素建议用isemp…

    2022年12月22日
  • 区分重写和重载1定义:方法的重载:在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即参数个数不同(包括参数顺序),参数类型不同。构造器可以重载。方法的重写(override/overwrite):子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作。2方法的重载:判断是否是重载跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系。方法的重写(override…

发表回复

您的电子邮箱地址不会被公开。

联系金沙1005

关注“java架构师必看”公众号

回复4,添加站长微信。

附言:ispacesoft.com网而来。

关注微信
网站地图