java8 时间与日期api的总结与实例

时间:2022-10-13 22:05:50

– 所有 java.time 对象都是不可变的。

– 一个瞬间(Instant)是时间上的一个点(与Date类似)

– 在java实际按中每天都是 86400秒 (即没有闰秒)

– 持续时间(Duration)是两个瞬间之间的时间

– LocalDateTime 没有时区信息

– TemporalAdjuster方法可以处理常用的日历计算,例如找到某个月的第一个星期二

– ZonedDateTime 是指定时区中的某一个时间点(类似于Gregorian Calendar)

– 当处理带时区的时间时,请使用时段(Period),而非Duration,以便将夏令谁的变化考虑在内

– 使用DateTimeFormatter来格式化和解析日期和时间

– Java日期和时间Api 规范要求Java使用如下时标”
+ 每天都有86400秒。
+ 每天正午与官方实际按准确匹配
+ 其他时间也要以一种精确定义的方式与其紧密匹配


– 它提供了javax.time.ZoneId用来处理时区。

– 它提供了LocalDate与LocalTime类

– Java 8中新的时间与日期API中的所有类都是不可变且线程安全的,这与之前的Date与Calendar API中的恰好相反,那里面像java.util.Date以及SimpleDateFormat这些关键的类都不是线程安全的。

– 新的时间与日期API中很重要的一点是它定义清楚了基本的时间与日期的概念,比方说,瞬时时间,持续时间,日期,时间,时区以及时间段。它们都是基于ISO日历体系的。

– 每个Java开发人员都应该至少了解这套新的API中的这五个类:

– Instant 它代表的是时间戳,比如2014-01-14T02:20:13.592Z,这可以从java.time.Clock类中获取,像这样: Instant current = Clock.system(ZoneId.of(“Asia/Tokyo”)).instant();

– LocalDate 它表示的是不带时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。

– LocalTime – 它表示的是不带日期的时间

– LocalDateTime – 它包含了时间与日期,不过没有带时区的偏移量

– ZonedDateTime – 这是一个带时区的完整时间,它根据UTC/格林威治时间来进行时区调整

– 这个库的主包是java.time,里面包含了代表日期,时间,瞬时以及持续时间的类。它有两个子package,一个是java.time.foramt,这个是什么用途就很明显了,还有一个是java.time.temporal,它能从更低层面对各个字段进行访问。

– 时区指的是地球上共享同一标准时间的地区。每个时区都有一个唯一标识符,同时还有一个地区/城市(Asia/Tokyo)的格式以及从格林威治时间开始的一个偏移时间。比如说,东京的偏移时间就是+09:00。

– OffsetDateTime类实际上包含了LocalDateTime与ZoneOffset。它用来表示一个包含格林威治时间偏移量(+/-小时:分,比如+06:00或者 -08:00)的完整的日期(年月日)及时间(时分秒,纳秒)。

– DateTimeFormatter类用于在Java中进行日期的格式化与解析。与SimpleDateFormat不同,它是不可变且线程安全的,如果需要的话,可以赋值给一个静态变量。DateTimeFormatter类提供了许多预定义的格式器,你也可以自定义自己想要的格式。当然了,根据约定,它还有一个parse()方法是用于将字符串转换成日期的,如果转换期间出现任何错误,它会抛出DateTimeParseException异常。类似的,DateFormatter类也有一个用于格式化日期的format()方法,它出错的话则会抛出DateTimeException异常。

– 再说一句,“MMM d yyyy”与“MMm dd yyyy”这两个日期格式也略有不同,前者能识别出”Jan 2 2014″与”Jan 14 2014″这两个串,而后者如果传进来的是”Jan 2 2014″则会报错,因为它期望月份处传进来的是两个字符。为了解决这个问题,在天为个位数的情况下,你得在前面补0,比如”Jan 2 2014″应该改为”Jan 02 2014″。

/**
* java8 新的时间和日期的API
* Created by 何欣澄 on 2017/4/2 0002.
*/

public class DateAndTIme {
public static void main(String[] args) {


// 本地时间 LocalDate LocalTime
// ---------例子------------
// 在Java 8中获取当天的日期
LocalDate today = LocalDate.now();
System.out.println("Today's Local date : " + today);

//在Java 8中获取当前的年月日
int year = today.getYear();
int month = today.getMonthValue();
Month month1 = today.getMonth();
int day = today.getDayOfMonth();
int dayOfYear = today.getDayOfYear();
System.out.println("Today in year"+dayOfYear);
System.out.printf("Year : %d Month : %d day : %d \t %n", year, month, day);

//在Java 8中获取某个特定的日期
LocalDate dateOfBirth = LocalDate.of(1990, 8, 6);
System.out.println("Your birthday is : " + dateOfBirth);

//在Java 8中检查两个日期是否相等
LocalDate date1 = LocalDate.of(2017, 3, 26);
if (date1.equals(today)) {
System.out.printf("Today %s and date1 %s are same date %n", today, date1);
}

//在Java 8中检查重复事件,比如说生日
MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(today);
if (currentMonthDay.equals(birthday)) {
System.out.println("Many Many happy returns of the day !!");
} else {
System.out.println("Sorry, today is not your birthday");
}

//在Java 8中获取当前时间
LocalTime time = LocalTime.now();
System.out.println("local time now : " + time);

//增加时间里面的小时数
LocalTime newTime = time.plusHours(2); // 增加两个小时
System.out.println("Time after 2 hours : " + newTime);

//获取1周后的日期
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
System.out.println("Today is : " + today);
System.out.println("Date after 1 week : " + nextWeek);

// 一年前后的日期
LocalDate previousYear = today.minus(1, YEARS);// ChronoUnit.YEARS
System.out.println("Date before 1 year : " + previousYear);
LocalDate nextYear = today.plus(1, YEARS);
System.out.println("Date after 1 year : " + nextYear);

//Java 8中自带了一个Clock类,你可以用它来获取某个时区下当前的瞬时时间,日期或者时间。
// 可以用Clock来替代System.currentTimeInMillis()

// 在Java 8中使用时钟
Clock clock = Clock.systemUTC();
System.out.println("Clock : " + clock);
Clock.systemDefaultZone();
System.out.println("Clock : " + clock);

//比较日期
LocalDate tomorrow = LocalDate.of(2017, 3, 26);
if (tomorrow.isAfter(today)) {
System.out.println("Tomorrow comes after today");
}
LocalDate yesterday = today.minus(1, DAYS);
if (yesterday.isBefore(today)) {
System.out.println("Yesterday is day before today");
}

//在Java 8中处理不同的时区
ZoneId america = ZoneId.of("America/New_York");
LocalDateTime localDateAndTime = LocalDateTime.now();
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localDateAndTime, america);
System.out.println("Current date and time in a particular timezone : " + dateAndTimeInNewYork);

//表示固定的日期,比如信用卡过期时间
YearMonth currentYearMonth = YearMonth.now();
System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
YearMonth creditCardExpiry = YearMonth.of(2018, Month.FEBRUARY);
System.out.printf("Your credit card expires on %s %n", creditCardExpiry);

//检查闰年
if(today.isLeapYear()){
System.out.println("This year is Leap year");
}else {
System.out.println("2017 is not a Leap year");
}

// Instant 对象表示时间轴上的一个点
// 元年 : 1970-1-1
// Instant.MIN 10亿年前
// Instant.MAX 10000000001231
Instant start = Instant.now();

System.out.println(Instant.MIN);
System.out.println(start);
System.out.println(Instant.MAX);

Instant end = Instant.now();

Duration timeElapsed = Duration.between(start, end);
long millis = timeElapsed.toMillis();
System.out.println("经过时间" + millis + "ms");

// api
/*
* plus,minus 对当前Instant或者Duration 添加或减少一段时间
* plusNanos,plusMillis,plusSeconds,plusMinutes,plusHours,plusDays
* 减法为 minusXxxx
*
* */

// 与旧api 之间的转换
Date date = Date.from(start);
Instant instant = date.toInstant();

//两个日期之间包含多少天,多少个月
LocalDate java8Release1 = LocalDate.of(2016, Month.JULY, 15);
LocalDate java8Release2 = LocalDate.of(2018, Month.JULY, 15);
Period periodToNextJavaRelease1 = Period.between(today, java8Release1); // period 表示时间段
Period periodToNextJavaRelease2 = Period.between(today, java8Release2); // period 表示时间段
System.out.println("Months left between today and Java 8 release1 : " + periodToNextJavaRelease1.getMonths() );
System.out.println("Months left between today and Java 8 release2 : " + periodToNextJavaRelease2.getMonths() );

//在Java 8中使用预定义的格式器来对日期进行解析/格式化
String dayAfterTomorrow = "20170326";
LocalDate formatted = LocalDate.parse(dayAfterTomorrow, DateTimeFormatter.BASIC_ISO_DATE);
System.out.printf("Date generated from String %s is %s %n", dayAfterTomorrow, formatted);

//在Java中使用自定义的格式器来解析日期
String goodFriday = "03 18 2016";
try {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy");
LocalDate holiday = LocalDate.parse(goodFriday, formatter);
System.out.printf("Successfully parsed String %s, date is %s%n", goodFriday, holiday);
} catch (DateTimeParseException ex) {
System.out.printf("%s is not parsable!%n", goodFriday);
ex.printStackTrace();
}

//在Java 8中对日期进行格式化,转换成字符串
LocalDateTime arrivalDate = LocalDateTime.now();
try {
DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm a");
String landing = arrivalDate.format(format);
System.out.printf("Arriving at : %s %n", landing);
} catch (DateTimeException ex) {
System.out.printf("%s can't be formatted!%n", arrivalDate);
ex.printStackTrace();
}

}
}