使用SimpleDateFormate和joda-time进行日期格式化

工作中需要将特定格式的日期,转化为时间戳。尝试了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会给出输入错误的原因。最最最重要的是,它是线程安全的!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值