java 8 通过发布新的Date-Time API (JSR 310)来进一步加强对日期和时间的处理。
在旧版本的Java中,日期时间API存在诸多问题,其中有:
Java 8 在java.time包下提供了很多新的API。以下为两个比较重要的API:
新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during),与时钟(clock)的操作。
LocalDate/LocalTime和LocalDateTime类可以在处理时区不是必须的情况。代码如下
public class Java8Tester{
public static void main(String args[]){
Java8Tester java8Tester = new Java8Tester();
java8Tester.testLocalDateTime();
}
public void testLocalDateTime(){
//获取当前日期时间
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("当前时间:"+currentTime);
LocalDate date1 = currentTime.toLocalDate();
System.out.println("date1: "+date1);
Month month = currentTime.getMonth();
int day = currentTime.getDayOfMonth();
int senconds = currentTime.getSecond();
System.out.println("月:"+ month + ",日:" + day + ",秒:" + senconds);
//指定年日 2019/09/10
LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2019);
System.out.println("date2: "+ date2);
//指定年月日 2019-11-10
LocalDate date3 = LocalDate.of(2019,Month.NOVEMBER,10);
System.out.println("date3: "+ date3);
//22时15分钟
LocalTime date4 = LocalTime.of(22,10);
System.out.println("date4: "+ date4);
//解析字符串
LocalTime date5 = LocalTime.parse("20:15:30");
System.out.println(date5);
}
}
执行以上脚本,输出结果为:
当前时间: 2018-06-08T15:19:16.910
date1:2018-06-08
月: JUNE, 日: 8, 秒: 16
date2:2012-06-10T15:19:16.910
date3:2014-12-12
date4:22:15
date5:20:15:30
如果我们需要考虑到时区,就可以使用时区的日期时间API:
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8Tester = new Java8Tester();
java8Tester.testZonedDateTime();
}
public void testZonedDateTime() {
// 获取当前时间日期
ZonedDateTime date1 = ZonedDateTime.parse("2019-12-03T10:15:30+05:30[Asia/Shanghai]");
System.out.println("date1: " + date1);
ZoneId id = ZoneId.of("Europe/Paris");
System.out.println("ZoneId: " + id);
ZoneId currentZone = ZoneId.systemDefault();
System.out.println("当期时区: " + currentZone);
}
}
执行以上脚本,输出结果为:
date1:2015-12-03T10:15:30+08:00[Asia/Shanghai]
ZoneId:Europe/Paris
当期时区: Asia/Shanghai
LocalDate today = LocalDate.now();
System.out.println("今天的日期是:"+today);
System.out.println("-----------------------------");
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.println("年:"+year+",月:"+month+",日:"+day);
System.out.println("-----------------------------");
LocalDate birthday = LocalDate.of(2011, 11, 11);
System.out.println("特定日期:"+birthday);
System.out.println("-----------------------------");
System.out.println("今天的日期是2011-11-11吗?"+today.equals(birthday));
System.out.println("-----------------------------");
LocalDate dayofbirth = LocalDate.of(2008, 11, 20);
LocalDate tday = LocalDate.now();
// 获取生日的月、日
MonthDay birthMonthDay = MonthDay.of(dayofbirth.getMonth(), dayofbirth.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(tday);
if (currentMonthDay.equals(birthMonthDay)) {
System.out.println("今天是你的生日");
}else{
System.out.println("对不起,今天不是你的生日");
}
System.out.println("-----------------------------");
LocalTime localTime = LocalTime.now();
System.out.println("现在的时间是"+localTime);
System.out.println("-----------------------------");
LocalTime twoHourLaterTime = localTime.plusHours(2);
System.out.println("当前时间两小时后的时间是"+twoHourLaterTime);
System.out.println("-----------------------------");
LocalDate oneWeekLaterDate = today.plus(1,ChronoUnit.WEEKS);
System.out.println("两周后的日期是:"+oneWeekLaterDate);
System.out.println("-----------------------------");
LocalDate oneYearBeforeDate = today.minus(1, ChronoUnit.YEARS);
System.out.println("一年前的日期是:"+oneYearBeforeDate);
LocalDate oneYearLaterDate = today.plus(1, ChronoUnit.YEARS);
System.out.println("一年后的日期是:"+oneYearLaterDate);
System.out.println("-----------------------------");
Clock clock = Clock.systemUTC();
System.out.println("Clock:"+clock);
Clock.systemDefaultZone();
System.out.println("Clock:"+clock.millis());
System.out.println("-----------------------------");
LocalDate day1 = LocalDate.of(2011, 12, 15);
LocalDate day2 = LocalDate.of(2011, 9, 17);
System.out.println("day1是否在day2之后:"+day1.isAfter(day2));
System.out.println("day1是否在day2之前:"+day1.isBefore(day2));
System.out.println("-----------------------------");
LocalDateTime todaytime = LocalDateTime.now();
System.out.println("当前的日期时间:"+todaytime);
ZoneId zone = ZoneId.of(ZoneId.SHORT_IDS.get("ACT"));
ZonedDateTime dateandtimeinNewYork = ZonedDateTime.of(todaytime, zone);
System.out.println("现在时区的时间在特定时区的时间:"+dateandtimeinNewYork);
System.out.println("-----------------------------");
YearMonth currentYearMonth = YearMonth.now();
System.out.println("今年的当前月"+currentYearMonth+"有"+currentYearMonth.lengthOfMonth()+"天");
YearMonth creditCardExpiry = YearMonth.of(2018, Month.FEBRUARY);
System.out.println("您输入的年月日期是:"+creditCardExpiry);
System.out.println("-----------------------------");
System.out.println("今年"+today+"是否是闰年:"+today.isLeapYear());
System.out.println("-----------------------------");
LocalDate day3 = LocalDate.of(2002, 12, 10);
LocalDate day4 = LocalDate.of(2001, 9, 12);
Period period = Period.between(day3, day4);
System.out.println(day3+"和"+day4+"之间相差"+period.getMonths()+"月");
System.out.println("-----------------------------");
LocalDateTime datetime = LocalDateTime.of(2016, Month.APRIL, 14, 14, 02, 24);
ZoneOffset offset = ZoneOffset.of("+05:30");
OffsetDateTime offsetdatetime = OffsetDateTime.of(datetime, offset);
System.out.println("日期和时间在时区上的偏移时间:"+offsetdatetime);
System.out.println("-----------------------------");
Instant timestamp = Instant.now();
System.out.println("当前时间戳:"+timestamp);
System.out.println("-----------------------------");
String dayaftertommrow = "20160205";
LocalDate formatdate = LocalDate.parse(dayaftertommrow,DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(dayaftertommrow+"格式化后的日期是"+formatdate);
System.out.println("-----------------------------");
String goodFriday = "04 14 2016";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM dd yyyy");
LocalDate holiday = LocalDate.parse(goodFriday,dateTimeFormatter);
System.out.println(goodFriday+"自定义格式化后的日期是"+holiday);
System.out.println("-----------------------------");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy HH:mm a");
String datestr = todaytime.format(formatter);
System.out.println("自定义格式化后的当前日期时间是"+datestr);