发表于: 2017-11-08 22:17:38
1 776
今天完成的事情
讲小课堂,查阅资料,为什么DB的设计中要使用Long来替换掉Date类型
MySQL中的表示时间的类型:
date:日期,占用三个字节,1000-01-01——9999-12-31
datetime:日期+时间,1000-01-01 00:00:00” 到“9999-12-31 23:59:59,占用8个字节,datetime类型适合用来记录数据的原始的创建时间,因为无论你怎么更改记录中其他字段的值,datetime字段的值都不会改变,除非你手动更改它。
timestamp:日期+时间,占用4个字节,“19700101080001——20380119111407,timestamp类型适合用来记录数据的最后修改时间,因为只要你更改了记录中其他字段的值,timestamp字段的值都会被自动更新。
MySQL中的bigint类型
bignit,表示从-2^63到2^63-1(即从-9,223,372,036,854,775,808到 9,223,372,036,854,775,807)之间的整数,它占用了八个字节的存储空间。
个人理解,在数据库中对时间进行处理的方法还是比较完善的,问题出在java程序向数据库传输时间数据的过程中,Java中Date类型的缺陷有:
1.java中对时间处理的类比较混乱,处理时间的类有:java.util.Date,java.sql.Date ,java.sql.Time ,java.sql.Timestamp,java.util.Calendar ,java.util.TimeZone
2.时区,在获取当前时间的时候,各个地区在同一个时间点会有不同的时间表示
3.精度,如将java.util.Date转为java.sql.Date的时候,日期的时分秒会被去掉,数据的精度发生了变化。而JDBC中定义接口时候,用的是java.sql.Date,而我们常常用到的Date都是java.util.Date,这往往导致一些转换过程中发生误差。
j在JDBC接口中使用了java.sql.Date,如果对其进行修改,JDBC接口规范也要改,那么将引发各个数据库厂商对数据库驱动也要改,这是不可接受的。
所以比较好的解决方法是,将date类型转换为long类型
1.有利于计算时间差,两个long类型的时间数据可以直接进行运算,得到某一过程所经过的时间值,而不必像date类型一样得先考虑格式之间得转换。
2.方便java与数据库之间的传输,当时间作为long类型的时候,其本质是一个长整数,直接对应于数据库中的bigint类型,可以十分方便地直接添加进数据库中,不必考虑类型不匹配的问题。其次,各个数据库中时间类型的格式标准也是不相同的,如
sql server的时间类型为:
Oracle的时间格式为:
如果直接采用long类型表示时间的话,每个数据库中都有与之对应的bigint类型,在迁移,或是兼容其他数据库的时候,可以省去很多转换的操作。
用long类型表示时间,并不是直接写为20171111这样的格式,而是取一个当前时间和1970-01-01 00:00:00这个时间点的差值,单位为秒,成为unix时间戳,比如,2017-11-08 23:00:28转换为long类型的话,表示为1510153228017
在java中,可以通过long time = System.currentTimeMillis()获得当前时间的long类型时间
long time=System.currentTimeMillis();
也可以通过Date date1=new Date()来获得当前的date类型的时间,再用long time=date1.getTime()将其转化为long类型,需要注意所引用的是 java.util.Date
Date date1=new Date();
long time=date1.getTime();
结果:
上面的是date类型,下面的是long类型
明天的计划
继续做任务
遇到的问题
准备资料,没什么时间做任务
收获
对java和数据库中的时间处理有了一些了解
评论