工欲善其事,必先利其器
工程中其实对时间的使用是非常多的。Java中的time其实一直都是一个比较蛋疼的问题。我看网上也是对其诟病已久。Java8也推出了java.time包以便于统一时间相关的管理,就此对Java中的时间进行一个简单的总结。主要是各种类型之间的转换,在此做一个简单的记录总结。
概括
这次主要包含了四种对象的相互转换,包括Date,Java8推出的LocalDateTime,long(timestamp),String(表现形式为String的时间啊)。另外,对Date统一用了org.joda.DateTime做一个封装,SimpleDateFormat确实不好用,还存在线程安全问题。
Date <==> long
long millis = System.currentTimeMillis();
System.out.println(millis);//1537621612687
//long -> Date
DateTime dateTime = new DateTime(millis);
System.out.println(dateTime.toDate());//Sat Sep 22 21:45:28 CST 2018
//Date -> long
DateTime now = new DateTime(new Date());
System.out.println(now.toDate().getTime());//1537621612794
Date <==> String
//String -> Date
String time = "2003-03-03T12:04:32.123Z";
DateTime dateTime1 = DateTime.parse(time, org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
System.out.println(dateTime1.toDate());//Mon Mar 03 12:04:32 CST 2003
System.out.println(dateTime1);//2003-03-03T12:04:32.123+08:00
//String <- Date
DateTime dateTime = new DateTime(new Date());
System.out.println(dateTime.withZone(DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+8:00"))));//2018-09-22T21:47:04.483+08:00
System.out.println(dateTime.toString("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));//2018-09-22T21:47:04.483Z
LocalDateTime <==> long
再来看看Java8推出的LocalDateTime
long millis = System.currentTimeMillis();
System.out.println(millis);//1537624862354
//long -> localDateTime
LocalDateTime dateTime =LocalDateTime.ofInstant(Instant.ofEpochMilli(millis), TimeZone.getDefault().toZoneId());
System.out.println(dateTime);//2018-09-22T22:01:02.354
dateTime =LocalDateTime.ofInstant(Instant.ofEpochSecond(millis / 1000), TimeZone.getDefault().toZoneId());
System.out.println(dateTime);//2018-09-22T22:22:28
dateTime =LocalDateTime.ofInstant(Instant.ofEpochMilli(millis), TimeZone.getTimeZone("GMT+8:00").toZoneId());
System.out.println(dateTime);//2018-09-22T22:22:28.674
dateTime =LocalDateTime.ofInstant(Instant.ofEpochMilli(millis), TimeZone.getTimeZone(ZoneId.SHORT_IDS.get("CTT")).toZoneId());
System.out.println(dateTime);
//long <- localDateTime
Instant ans = LocalDateTime.now().toInstant(ZoneOffset.of("+8"));
System.out.println(ans.getEpochSecond());//1537626148
System.out.println(ans.getNano());//869000000
LocalDateTime <==> String
String time = "2003-03-03T12:04:32.123Z";
LocalDateTime t = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
System.out.println(t);//2003-03-03T12:04:32.123
//localDateTime -> String
String ans = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
System.out.println(ans);//2018-09-22T22:41:18.391Z
ans = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd日"));
System.out.println(ans);//2018-09-22日
至于LocalDateTime和Date之间的转换,可以通过timestamp来。
写在最后
其实本该8月就能弄好的,奈何这段时间公司项目需求比较多,迭代很快,忙到模糊。时至今日,中秋即将到来之际才匆匆整理出来。最后,祝各位中秋快乐,心想事成。