工作中需要将特定格式的日期,转化为时间戳。尝试了java的SimpleDateFormate类、joda-time库两种方式来实现,发现SimpleDateFormate还是有不少的缺陷,推荐使用joda-time进行格式化,两种方法的代码如下:
SimpleDateFormate
public class Trans {
public String StringToTimestamp(String str) throws Exception {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = simpleDateFormat.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
long ts = date.getTime();
return ts+"";
}
@Test
public void tests() throws Exception {
String ts = StringToTimestamp("2020-08-12 00:00");
System.out.println(ts);
}
}
可以看出SimpleDateFormate在parse的过程中需要抛出异常,但这个异常检测并不总是生效。例如:
Input[1]: "2020-08-12 00:00:00"
Output[1]: 1597161600000
Input[2]: "2020-33-12 00:00:00"
Output[2]: 1662912000000
Input[3]: "2020-08-12 00:00"
Output[3]: NullPointerException
Input[4]: "2020-08-12 00:00:00 222"
Output[4]: 1597161600000
可以发现,当出现年月日、时分秒超出取定值时,SimpleDateFormate是编译通过的,而且会自动帮忙计算进位。另外,它只会截取Format里面的位数,字符串超过的部分会直接被忽略掉。这些问题,对大型项目的异常检测带来了麻烦。
simpleDateFormat.setLenient(false);
date = simpleDateFormat.parse(str);
可以通过setLenient来解决。默认值是true,设置为false后,将进行严格匹配,不会把溢出范围的时间自动转换,但依旧会忽略超出长度的字符串。
joda-time
simpleDateFormat这个类第一次运行的时候是比较慢的,而且不是线程安全的。所以有人开发出了joda-time库,专门处理时间格式问题。转化时间戳的方法如下:
pom.xml配置
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.5</version>
</dependency>
public void a() throws Exception {
String startTime = "2020-08-23 00:00:00";
long start = DateTime.parse(startTime,
DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getMillis();
System.out.println(start);
@Test
public void tests() throws Exception {
a();
}
}
joda-time的异常检验抛出,是比较有效的。
Input[1]: "2020-08-12 00:00:00"
Output[1]: 1597161600000
Input[2]: "2020-33-12 00:00:00"
Output[2]: Cannot parse "2020-33-12 00:00:00": Value 33 for monthOfYear must be in the range [1,12]
Input[3]: "2020-08-12 00:00"
Output[3]: Invalid format: "2020-33-12 00:00" is too short
Input[4]: "2020-08-12 00:00:00 222"
Output[4]: Invalid format: "2020-08-12 00:00:00 222" is malformed at " 222"
joda-time是严格匹配,不会自动将超过变量范围的数值进位,也不会忽略超出长度的字符串。并且,joda-time会给出输入错误的原因。最最最重要的是,它是线程安全的!