(推荐使用Java8新的时间API)
1 Java 8 java.time.* 下面的常用API
DateTimeFormatter
LocalDate
LocalDateTime
LocalTime
Clock
MonthDay
YearMonth
2 Java 8 时间 API 优点
-
线程安全 java.time 包下的所有类都是不可变类型且线程安全。老的时间 API,java.util.Date 为可变类型,以及 SimpleDateFormat 为非线程安全使其应用非常受限。
-
格式化便捷 DateTimeFormatter 类用来格式化和解析时间,线程安全。不用再依赖 Joda Time 等第三方库。
-
判断闰年 LocalDate 类有一个很实用的方法 isLeapYear() 判断该实例是否是一个闰年。
-
时间戳 增加了一个 Clock 时钟类用于获取当时的时间戳,或当前时区下的日期时间信息。以前用到
System.currentTimeInMillis()
和TimeZone.getDefault()
的地方都可用Clock
替换。
3 示例代码
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import org.junit.Test;
/**
* @version $Id: JavaTime.java, v 0.1 2017年7月30日 上午10:11:14
*/
public class JavaTime {
@Test
public void test() {
System.out.println("/************************************************************************************/");
/************************************************************************************/
// LocalDate;LocalTime;LocalDateTime 得到时间对象的一组方法,LocalDateTime最后一位是纳秒,1秒=1000
// 000 000纳秒
System.out.println("获取时间:");
System.out.println("LocalDateTime.now()-->" + LocalDateTime.now());
System.out.println("LocalDate.now()-->" + LocalDate.now());
System.out.println("LocalTime.now()-->" + LocalTime.now());
// 也都有of()方法,都有多个重载,灵活使用
System.out.println("LocalDate.of(2017,05,10)-->" + LocalDate.of(2017, 05, 10));
System.out.println("LocalTime.of(2017,05,10,22,33,44,1000)-->" + LocalTime.of(22, 33, 44, 1000));
System.out.println(
"LocalDateTime.of(2017,05,10,22,33,44,1000)-->" + LocalDateTime.of(2017, 05, 10, 22, 33, 44, 1000));
// 可获取年,月,日,时,分,秒,纳秒
System.out.println("LocalDateTime.now()-->" + LocalDateTime.now());
System.out.println("LocalDateTime.now().getYear()-->" + LocalDateTime.now().getYear());
System.out.println("LocalDateTime.now().getMonthValue()-->" + LocalDateTime.now().getMonthValue());
System.out.println("LocalDateTime.now().getDayOfMonth()-->" + LocalDateTime.now().getDayOfMonth());
System.out.println("LocalDateTime.now().getHour()-->" + LocalDateTime.now().getHour());
System.out.println("LocalDateTime.now().getMinute()-->" + LocalDateTime.now().getMinute());
System.out.println("LocalDateTime.now().getSecond()-->" + LocalDateTime.now().getSecond());
System.out.println("LocalDateTime.now().getNano()-->" + LocalDateTime.now().getNano());
System.out.println("/************************************************************************************/");
/************************************************************************************/
System.out.println("解析时间1:(去掉纳秒,秒等)");
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("localDateTime-->" + localDateTime);
System.out.println("localDateTime.withNano(0)-->" + localDateTime.withNano(0));
System.out.println("localDateTime.withSecond(0)-->" + localDateTime.withSecond(0));
System.out.println("localDateTime.withSecond(0)..withNano(0)-->" + localDateTime.withSecond(0).withNano(0));
try {
System.out
.println("/************************************************************************************/");
/************************************************************************************/
// 一般使用自定义的格式来达到(字符串->时间)(时间->字符串),更加方便灵活
System.out.println("格式化和解析时间2:(时间->字符串)");
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
System.out.println("格式化为" + "yyyy-MM-dd hh:mm:ss-->" + LocalDateTime.now().format(format));
System.out
.println("/************************************************************************************/");
/************************************************************************************/
System.out.println("格式化和解析时间3:(字符串->时间)||可一次指定多格式字符串");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[yyyy/MM/dd HH:mm:ss.SSSSSS]"
+ "[yyyy-MM-dd HH:mm:ss]" + "[dd-MM-yyyy HH:mm:ss]" + "[ddMMyyyy HH:mm:ss]");
System.out.println("[示例]指定可匹配的多格式:" + "[yyyy/MM/dd HH:mm:ss.SSSSSS]" + "[yyyy-MM-dd HH:mm:ss]"
+ "[dd-MM-yyyy HH:mm:ss]" + "[ddMMyyyy HH:mm:ss]");
System.out.println(LocalDateTime.parse("2016/03/23 22:33:44.256145", formatter));
System.out.println(LocalDateTime.parse("2016-03-23 22:33:44", formatter));
System.out.println(LocalDateTime.parse("23-05-2016 22:33:44", formatter));
System.out.println(LocalDateTime.parse("23052016 22:33:44", formatter));
} catch (Exception e) {
System.out.println(e);
}
}
}
结果:
/************************************************************************************/
获取时间:
LocalDateTime.now()-->2017-07-30T15:24:23.841
LocalDate.now()-->2017-07-30
LocalTime.now()-->15:24:23.841
LocalDate.of(2017,05,10)-->2017-05-10
LocalTime.of(2017,05,10,22,33,44,1000)-->22:33:44.000001
LocalDateTime.of(2017,05,10,22,33,44,1000)-->2017-05-10T22:33:44.000001
LocalDateTime.now()-->2017-07-30T15:24:23.842
LocalDateTime.now().getYear()-->2017
LocalDateTime.now().getMonthValue()-->7
LocalDateTime.now().getDayOfMonth()-->30
LocalDateTime.now().getHour()-->15
LocalDateTime.now().getMinute()-->24
LocalDateTime.now().getSecond()-->23
LocalDateTime.now().getNano()-->842000000
/************************************************************************************/
解析时间1:(去掉纳秒,秒等)
localDateTime-->2017-07-30T15:24:23.842
localDateTime.withNano(0)-->2017-07-30T15:24:23
localDateTime.withSecond(0)-->2017-07-30T15:24:00.842
localDateTime.withSecond(0)..withNano(0)-->2017-07-30T15:24
/************************************************************************************/
格式化和解析时间2:(时间->字符串)
格式化为yyyy-MM-dd hh:mm:ss-->2017-07-30 03:24:23
/************************************************************************************/
格式化和解析时间3:(字符串->时间)||可一次指定多格式字符串
[示例]指定可匹配的多格式:[yyyy/MM/dd HH:mm:ss.SSSSSS][yyyy-MM-dd HH:mm:ss][dd-MM-yyyy HH:mm:ss][ddMMyyyy HH:mm:ss]
2016-03-23T22:33:44.256145
2016-03-23T22:33:44
2016-05-23T22:33:44
2016-05-23T22:33:44