一、基本概念
定义:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
时间戳(timestamp),通常是一个字符序列,唯一地标识某一刻的时间。
二、Java中的时间戳
Java中的java.util.Date为我们提供了操作时间的一系列操作,当然也提供了获取时间戳的方法,我们可以调用Date对象的getTime() 方法来返回当前对象的时间戳。需要注意的是时间戳是以毫秒为单位的,也就是说Java的时间戳的精确度在毫秒级别。而unix中时间戳是精确到秒级别,所以我们参考一些资料的时候会出现/1000(除以1000)的情况,将Java的时间戳的级别精确到秒所有要去除后三位即可,也就是除以1000了。
示例一:获取当前时间的时间戳
@Test
public void test() {
SimpleDateFormat dateFormate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
Date timeOfNow = new Date();// 获取当前系统时间
String strTime = dateFormate.format(timeOfNow);// 格式化时间
System.out.println("当前时间为:" + strTime);// 输出当前时间
Long strTimeStamp = timeOfNow.getTime();// 获取时间的时间戳
System.out.println("当前时间的时间戳为:" + strTimeStamp);// 输出当前时间的时间戳
}
运行结果为:
当前时间为:2017-05-10 23:52:19
当前时间的时间戳为:1494431539619
示例二:将时间戳转换为Date对象
@Test
public void test() {
SimpleDateFormat dateFormate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
Long timeStamp = new Long("1494431539619");// 定义时间戳
String formateStampToString = dateFormate.format(timeStamp);// 将时间戳转换为字符串类型的Date
System.out.println("Format To String(Date):" + formateStampToString);
try {
Date formateStampToDate = dateFormate.parse(formateStampToString);// 将字符串转换为Date类型
System.out.println("Format To Date:" + formateStampToDate); // 输出Date
} catch (ParseException e) {
e.printStackTrace();
}
}
运行结果为:
Format To String(Date):2017-05-10 23:52:19
Format To Date:Wed May 10 23:52:19 CST 2017
示例三:Date(or String)转化为时间戳
@Test
public void test() {
SimpleDateFormat dateFormate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
String time = "1970-01-06 11:45:55";
try {
Date date = dateFormate.parse(time);
System.out.print("Format To times:" + date.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}
运行结果为:Format To times:445555000
注意事项:定义SimpleDateFormat时newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");里面字符串头尾不能有空格,如果有空格那么用做转换时对应的时间字符串也要有空格(两者是对应的),否则会报错,报错信息如下:
java.text.ParseException: Unparseable date: "1970-01-06 11:45:55"
at java.text.DateFormat.parse(DateFormat.java:366)
...
三、数据库中的时间戳
3.1 MySQL获得当前时间戳函数
函数为:current_timestamp, current_timestamp()
示例:
select current_timestamp, current_timestamp();
注意:此时输出的时间戳不是总秒数,而是当前的时间。
3.2 MySQL (Unix 时间戳、日期)转换函数
获取Unix时间戳函数:
- unix_timestamp();//获取当前时间的时间戳
- unix_timestamp(date);//获取指定时间所对应的时间戳
将时间戳转换为时间:
- from_unixtime(unix_timestamp);
- from_unixtime(unix_timestamp,format);//指定转换时间的格式
示例:
select unix_timestamp(); -- 1218290027
select unix_timestamp('2008-08-08'); -- 1218124800
select unix_timestamp('2008-08-08 12:30:00'); -- 1218169800
select from_unixtime(1218290027); -- '2008-08-09 21:53:47'
select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'
其它详细的函数就不在此赘述了,详见MySQL的API。
3.3 timestamp数据类型
timestamp 这种数据类型表现为自动生成,Mysql中其默认值为CURRENT_TIMESTAMP,也就是上面所提及的获取当前时间戳的函数,每当更新数据时其会自动进行更新。
timestamp 一般用作给表中行加版本戳。存储大小为 8 字节。 虽然timestamp 显示格式与datetime的显示格式完全一样,换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。其差异可参考:MySQL中的datetime与timestamp比较
看到这里,您是否对给表加版本戳感到疑惑,其实我也想更加细化的弄明白它,所以写下了下面这篇博客可供参考:Hibernate事务中的加锁机制
参考资料: