Unix时间戳

1. 什么是Unix时间戳

Unix时间戳(Unix time, POSIX time或Unix timestamp等)是指从1970年的1月1号00:00:00(世界标准时间,UTC)开始所经过的秒数,但不考虑闰秒。内核版本比较低的Linux系统由于将Unix时间戳存储为32位,它能被表示的最后时间是2038年1月19日03:14:07(UTC),因此会导致2038年问题。根据表示的精确度的不同,Unix时间戳有10位(秒级),也有13位(毫秒级),也有19位(纳秒级)等。

2. Unix时间戳转为普通时间

Unix时间戳可以很方便地转为标准时间,可以用Shell、Python和Java等。

2.1 Shell

利用date命令,可以将Unix时间戳转为普通时间,格式为:

1
$ date -d @UnixTimeStamp

比如将Unix时间戳1430297168转为普通时间,可以用如下命令:

1
$ date -d @1430297168

输出Wed Apr 29 16:46:08 CST 2015,可以通过增加选项控制输出的格式,比如

1
$ date -d @1430297168 +%Y%m%d-%T

输出20150429-16:46:08

注意:对于13位的Unix时间戳,应该将其除以1000,使得小数点前面有10位(或者直接去掉后面3位),上述命令才能正常运行,比如Unix时间戳1430297168472,应该使用如下命令进行转换:

1
$ date -d @1430297168.472 +%Y%m%d-%T

2.2 Python

用Python将Unix时间戳转为普通时间,可以使用如下脚本:

1
2
import time
time.strftime('%Y%m%d %H:%M:%S', time.localtime(UnixTimeStamp))

比如,

1
2
import time
print time.strftime('%Y%m%d %H:%M:%S', time.localtime(1430297168));

输出20150429 16:46:08

同样要注意的是,对于13位的Unix时间戳,应该将其除以1000,其他位数的格式也类似处理,使得小数点前面有10位。

2.3 Java

使用Java进行时间戳的转换,可以采用如下toStrDate函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.text.SimpleDateFormat;
public class Convert {
// 时间戳转换函数
public String toStrDate(String timestampString) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Long time = new Long(timestampString);
String date = format.format(time);
return date;
}
// 测试Unix时间戳1430297168,乘以1000,再转换
public static void main(String[] args) {
Convert convert = new Convert();
String timeStamp = "1430297168000";
String timeStr = convert.toStrDate(timeStamp);
System.out.println("toStrDate: " + timeStr);
}
}

注意,toStrDate函数默认处理13位的Unix时间戳,如果是10位的,应该乘以1000,再进行转换,如上所示。

3. 获取当前时间戳

3.1 Shell

利用date命令,可以获取当前时间戳,格式为:

1
$ date +%s

可以输出当前时间戳1430305723

3.2 Python

用Python获取当前时间戳,如下:

1
2
import time
time.time()

输出当前时间戳1430305995.825008

3.3 Java

使用Java获取当前时间戳有如下的几种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Date;
import java.util.Calendar;
public class GetCurrentTimeStamp {
public static void main(String[] args) {
// method 1,如果要获取毫秒,则可以不用除以1000
long timeStamp1 = System.currentTimeMillis() / 1000;
System.out.println("timeStamp1:" + timeStamp1);
// method 2
long timeStamp2 = Calendar.getInstance().getTimeInMillis() / 1000;
System.out.println("timeStamp2:" + timeStamp2);
// method 3
long timeStamp3 = new Date().getTime() / 1000;
System.out.println("timeStamp3:" + timeStamp3);
}
}

4. 获取特定时间的时间戳

4.1 Shell

利用date命令,可以将普通时间转为时间戳,命令如下:

1
$ date -d "2015-04-29 20:43:28" +%s

输出1430311408

4.2 Python

获取特定时间的时间戳,python脚本如下:

1
2
3
4
import datetime,time
s = datetime.datetime(2015, 4, 29, 20, 43, 28);
timeStamp = time.mktime(s.timetuple());
print timeStamp

输出1430311408.0

4.3 Java

获取特定时间的时间戳,java代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class GetTimeStamp {
public static void main(String[] args) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = "2015-04-29 20:43:28";
Date date = format.parse(time);
// 除以1000,获取秒级的时间戳
long timeStamp = date.getTime() / 1000;
System.out.println("timeStamp: " + timeStamp);
}
catch (ParseException e) {
e.printStackTrace();
}
}
}

输出timeStamp: 1430311408

5. 参考资料