每次写关于Java time的时候总是要抓狂,所以特此写这篇博文记录自己的心酸历程。


写了很多关于Java时间的小需求,发现有一种方法最为无脑,那就是通过毫秒数为中介进行转换,下面的栗子都将体现这一方法特性:


转换成毫秒数

获取系统当前时间的毫秒数

这个没什么好说的,就是:

System.currentTimeMillis()


当然,也可以复杂点,这就要用到我下面要说的东西:

Java 毫秒转日期 java 时间转毫秒_Java 时间

Java 毫秒转日期 java 时间转毫秒_Java 毫秒转日期_02

一般没特意导入包的时候,new Date()的类型提示第一个就是java.util.Date,一般都会导入第一个吧。

Java 毫秒转日期 java 时间转毫秒_Java将毫秒数转换为时间_03


将java.util.Date和java.sql.Date转化为毫秒数

使用getTime()函数。

Java 毫秒转日期 java 时间转毫秒_Java 毫秒转日期_04


将任意一个日期转化为毫秒数


Java 毫秒转日期 java 时间转毫秒_Java 时间_05

至于为什么加那个try...catch,不加会报错,试一下就知道了。


将毫秒数转换为Date

将毫秒数转化为java.util.Date

直接使用构造方法:

Java 毫秒转日期 java 时间转毫秒_Java 毫秒转日期_06

Java 毫秒转日期 java 时间转毫秒_Java 毫秒转日期_07

Java 毫秒转日期 java 时间转毫秒_Java将毫秒数转换为时间_08



将毫秒数转化为java.sql.Date

同样是使用构造方法:


Java 毫秒转日期 java 时间转毫秒_Java 毫秒转日期_09

Java 毫秒转日期 java 时间转毫秒_Java将毫秒数转换为时间_10

Java 毫秒转日期 java 时间转毫秒_Java将毫秒数转换为时间_11

这里和上面那个还不一样。


将毫秒数转化为想要的时间格式

这里就要涉及到SimpleDateFormat这个类了。

为了方便起见,以下的Date全部都是java.util.Date,毕竟java.sql.Date用的不是很多。

Java 毫秒转日期 java 时间转毫秒_Java将毫秒数转换为时间_12

Java 毫秒转日期 java 时间转毫秒_Java 时间_13



刚刚尝试了一下,发现可以省略掉new Date()的过程。

Java 毫秒转日期 java 时间转毫秒_Java 毫秒转日期_14


如果涉及到把时间存入数据库的需求时,我一般是这么做的:

(1)把时间类型设置为long或者String

(2)每次都获取到毫秒数(long型),转化一下(对String而言)存入数据库

(3)读出时,转化一下(对String而言),然后使用SimpleDateFormat.format()输出为想要的格式


如果是数据库里保存的时间是Date的话,读出来的时间可以用java.sql.Date接收,不知道java.util.Date能不能,个人认为应该是可以的,毕竟java.sql.Date是java.util.Date的子类。


如果又涉及到在当前时间上加上减去几天的话。可以这样:

一天是:24*60*60*1000毫秒

然后将要操作的时间的毫秒数加上或减去n个一天就行,得到的仍是一个long型毫秒数。

要注意的是小心long型溢出的问题,你用30*24*60*60*1000是会溢出的。怎么解决呢,分成两次做20*24*60*60*1000 + 10*24*60*60*1000


当然,这只是个人愚见,没有考虑时间效率什么的,只是个人图个简单。如果大家有什么高招的话,请多多指教。


还有一点要说明的是,这个毫秒数是距离1970年1月1日, 00:00:00的毫秒数,也就是UTC时间(我看有人这么说),下图是我的考证,oracle的API

Java 毫秒转日期 java 时间转毫秒_Java 时间_15

下有个叫UTC的函数,这个函数的返回值就是一个毫秒数;我们都知道外国人给函数取名不是那么随便的,这样取名可能也说明UTC时间是有这么个含义。

Java 毫秒转日期 java 时间转毫秒_java时间转换成毫秒数_16


那么这个UTC时间和Unix时间戳(不知道的自己搜)有啥区别呢?

区别就是一个是毫秒为单位一个是秒为单位。