out.println(session.getLastAccessedTime());的返回值到底是毛线意思???

out.println(session.getLastAccessedTime());这个语句是输出最后一次成功获取session对象Attribute值的一个指令, 他的返回值是一个long型数据, 具体数值为1448334229658.

其实现在你们看到的这个long型数据是随时在变化的, 这个数字是时间在2015-11-24 11:04:02时的数据, 再详细点的解释就是2015-11-24 11:04:02距离1970-1-1 0:0:0的毫秒数.

为什么会是这个时间? 不止是这里, 包括很多其他编程语言还有Oracle数据库都是以1970-1-1 0:0:0作为时间原点, 这个时间发生了什么事? 下面请看前方发来的报道......

网上的解释说:

java起源于UNIX系统,而UNIX认为1970年1月1日0点是时间纪元.但这依然没很好的解释"为什么",出于好奇,继续Google,总算找到了答案:

最初计算机操作系统是32位,而时间也是用32位表示。

System.out.println(Integer.MAX_VALUE);

结果为2147483647

Integer在JAVA内用32位表示,因此32位能表示的最大值是2147483647。另外1年365天的总秒数是31536000,

2147483647/31536000 = 68.1

也就是说32位能表示的最长时间是68年,而实际上到2038年01月19日03时14分07秒,便会到达最大时间,过了这个时间点,所有32位操作系统时间便会变为

10000000 00000000 00000000 00000000

也就是1901年12月13日20时45分52秒,这样便会出现时间回归的现象,很多软件便会运行异常了。到这里,我想问题的答案已经出来了:

因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始时间),而java自然也遵循了这一约束。

至于时间回归的现象相信随着64为操作系统的产生逐渐得到解决,因为用64位操作系统可以表示到292,277,026,596年12月4日15时30分08秒,相信我们的N代子孙,哪怕地球毁灭那天都不用愁不够用了,因为这个时间已经是千亿年以后了。

 

时间: 2024-10-09 04:46:13

out.println(session.getLastAccessedTime());的返回值到底是毛线意思???的相关文章

java.lang.Object.hashCode()的返回值到底是不是对象内存地址?

刚学Java的时候我也有过这种怀疑,但一直没有验证:最近在OSCHINA上看到有人在回答问题时也这么说,于是萌生了一探究竟的想法--java.lang.Object.hashCode()的返回值到底是不是对象内存地址? (顺带回顾一下JNI) hashCode契约 说到这个问题,大家的第一反应一定和我一样--去查Object.hashCode的源码,但翻开源码,看到的却是这样的(Oracle JDK 8): /** * Returns a hash code value for the obje

C++ 赋值构造函数的返回值到底有什么用?且返回值是否为引用类型有什么区别吗?

首先定义类Person class Person{ public: string name; Person()=default; //默认构造函数 Person(string nam):name(nam){} void operator=(const Person& p){ //赋值构造函数 this->name=p.name; } }; Person a("xiaoming"); Person b; cout<<b.name<<endl; //空

java中Arrays类中,binarySearch()方法的返回值问题

最近在复习Java知识,发现果然不经常使用忘得非常快... 看到binarySearch()方法的使用时,发现书上有点错误,于是就自己上机实验了一下,最后总结一下该方法的返回值. 总结:binarySearch()方法的返回值为:1.如果找到关键字,则返回值为关键字在数组中的位置索引,且索引从0开始2.如果没有找到关键字,返回值为负的插入点值,所谓插入点值就是第一个比关键字大的元素在数组中的位置索引,而且这个位置索引从1开始. 注意:调用binarySearch()方法前要先调用sort方法对数

Java线程池,获取返回值

程序中使用的是Callable接口,可以获取线程的返回值. package liuzh; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.Lin

java——如何通过class调用该类的方法并获得返回值?(反射)

demo: public class T{ public static void main(String[] args) throws Exception{ //获得Person的Class对象 Class<?> cls = Person.class;//Class.forName("testJavaSE.Person"); Constructor con = cls.getDeclaredConstructor(); System.out.println("得到

mybatis 中的 update 返回值

摘自:https://www.jianshu.com/p/80270b93082a 如果定义一个如下的update函数,那么这个函数的返回值到底是啥意思呢?是受影响的行数吗? 验证之前我们先看看数据库中的数据记录.总共两条数据记录! 数据库链接配置为: jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=123456 下面看看我们的单

ctypes获取扩展模块中函数的返回值

ctypes获取返回值 我们前面已经看到了,通过ctypes像扩展模块中的函数传参时是没有问题的,但是我们如何拿到返回值呢?我们之前都是使用printf直接打印的,但是这样显然不行,我们肯定是要拿到返回值去做一些别的事情的.那么我们看看如何使用ctypes获取函数的返回值. 获取整型返回值 int test1(int a, int b) { int c; c = a + b; return c; } void test2() { } 我们定义了两个函数,下面编译成dll文件,dll文件名叫做mm

session.save()返回值问题

正常都应该返回插入的主键 但是 如果你用sessionFactory来写就一定返回0 先科普下持久化数据库的三个状态方便下面理解 一次会话状态中,持久化对象经历以下三种状态:1 transient:对象不与数据库中任意数据相关联.(也就是主键上面没有值)2 persistent:对象与数据库中的数据关联,包含持久标识,Hibernate保证对象持久标识与数据库主键一致.3 detached(脱管.游离状态) 因为 使用getCurrentSession来创建session的话 在commit后

03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma

 1 PersonTestMapper.xml中的内容如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:命名空间