- Instant——它代表的是工夫戳
- LocalDate——不蕴含具体工夫的日期,比方 2020-01-14。它能够用来存储生日,周年纪念日,入职日期等。
- LocalTime——它代表的是不含日期的工夫
- LocalDateTime——它蕴含了日期及工夫,不过还是没有偏移信息或者说时区。
- ZonedDateTime——这是一个蕴含时区的残缺的日期工夫,偏移量是以 UTC / 格林威治工夫为基准的。
Java 8 是如何解决工夫及日期的
示例 1 如何 在 Java 8 中获取当天的日期
LocalDate today = LocalDate.now();
System.out.println("Today's Local date : " + today);
Output
Today's Local date : 2020-01-14
示例 2 如何在 Java 8 中获取以后的年月日
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.printf("Year : %d Month : %d day : %d \t %n", year, month, day);
Output
Today's Local date : 2020-01-14
Year : 2020 Month : 1 day : 14
示例 3 在 Java 8 中如何获取某个特定的日期
LocalDate dateOfBirth = LocalDate.of(2010, 01, 14);
System.out.println("Your Date of birth is :" + dateOfBirth);
Output : Your Date of birth is : 2010-01-14
示例 4 在 Java 8 中如何查看两个日期是否相等
LocalDate date1 = LocalDate.of(2020, 01, 14); if(date1.equals(today)){System.out.printf("Today %s and date1 %s are same date %n", today, date1);
}
Output
today 2020-01-14 and date1 2020-01-14 are same date
示例 5 在 Java 8 中如何查看反复事件,比如说生日
LocalDate dateOfBirth = LocalDate.of(2010, 01, 14);
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");
}
Output: Many Many happy returns of the day !!
示例 6 如何在 Java 8 中获取以后工夫
LocalTime time = LocalTime.now();
System.out.println("local time now :" + time);
Output
local time now : 16:33:33.369 // in hour, minutes, seconds, nano seconds
示例 7 如何减少工夫外面的小时数
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(2); // adding two hours
System.out.println("Time after 2 hours :" + newTime);
Output :
Time after 2 hours : 18:33:33.369
示例 8 如何获取 1 周后的日期
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
System.out.println("Today is :" + today);
System.out.println("Date after 1 week :" + nextWeek);
Output:
Today is : 2020-01-14
Date after 1 week : 2020-01-21
示例 9 一年前后的日期
LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
System.out.println("Date before 1 year :" + previousYear);
LocalDate nextYear = today.plus(1, YEARS);
System.out.println("Date after 1 year :" + nextYear);
Output:
Date before 1 year : 2019-01-14
Date after 1 year : 2021-01-14
示例 10 在 Java 8 中应用时钟
// Returns the current time based on your system clock and set to UTC.
Clock clock = Clock.systemUTC();
System.out.println("Clock :" + clock);
// Returns time based on system clock zone Clock defaultClock =
Clock.systemDefaultZone();
System.out.println("Clock :" + clock);
Output:
Clock : SystemClock[Z]
Clock : SystemClock[Z]
public class MyClass {
private Clock clock; // dependency inject ...
public void process(LocalDate eventDate) {if(eventDate.isBefore(LocalDate.now(clock)) {...}
}
}
示例 11 在 Java 中如何判断某个日期是在另一个日期的后面还是前面
LocalDate tomorrow = LocalDate.of(2020, 1, 15);
if(tommorow.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");
}
Output:
Tomorrow comes after today
Yesterday is day before today
示例 12 在 Java 8 中解决不同的时区
// Date and time with timezone in Java 8 ZoneId america = ZoneId.of("America/New_York");
LocalDateTime localtDateAndTime = LocalDateTime.now();
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america);
System.out.println("Current date and time in a particular timezone :" + dateAndTimeInNewYork);
Output :
Current date and time in a particular timezone : 2020-01-14T16:33:33.373-05:00[America/New_York]
Exception in thread "main" java.time.zone.ZoneRulesException: Unknown time-zone ID: ASIA/Tokyo
at java.time.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:272)
at java.time.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:227)
at java.time.ZoneRegion.ofId(ZoneRegion.java:120)
at java.time.ZoneId.of(ZoneId.java:403)
at java.time.ZoneId.of(ZoneId.java:351)
示例 13 如何示意固定的日期,比方信用卡过期工夫
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);
Output:
Days in month year 2020-01: 31
Your credit card expires on 2018-02
示例 14 如何在 Java 8 中查看平年
if(today.isLeapYear()){System.out.println("This year is Leap year");
}else {System.out.println("2020 is not a Leap year");
}
Output: 2020 is not a Leap year
示例 15 两个日期之间蕴含多少天,多少个月
LocalDate java8Release = LocalDate.of(2020, Month.MARCH, 14);
Period periodToNextJavaRelease = Period.between(today, java8Release);
System.out.println("Months left between today and Java 8 release :" + periodToNextJavaRelease.getMonths() );
Output:
Months left between today and Java 8 release : 2
示例 16 带时区偏移量的日期与工夫
LocalDateTime datetime = LocalDateTime.of(2020, Month.JANUARY, 14, 19, 30);
ZoneOffset offset = ZoneOffset.of("+05:30");
OffsetDateTime date = OffsetDateTime.of(datetime, offset);
System.out.println("Date and Time with timezone offset in Java :" + date);
Output :
Date and Time with timezone offset in Java : 2020-01-14T19:30+05:30
示例 17 在 Java 8 中如何获取以后工夫戳
Instant timestamp = Instant.now();
System.out.println("What is value of this instant" + timestamp);
Output :
What is value of this instant 2020-01-14T08:33:33.379Z
示例 18 如何在 Java 8 中应用预约义的格局器来对日期进行解析 / 格式化
String dayAfterTommorrow = "20200116";
LocalDate formatted = LocalDate.parse(dayAfterTommorrow,
DateTimeFormatter.BASIC_ISO_DATE);
System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow, formatted);
Output :
Date generated from String 20200116 is 2020-01-16
示例 19 如何在 Java 中应用自定义的格局器来解析日期
String goodFriday = "Apr 18 2020";
try {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM 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();}
Output :
Successfully parsed String Apr 18 2020, date is 2020-04-18
示例 20 如何在 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();}
Output : Arriving at : Jan 14 2020 04:33 PM
示例 21 获取工夫戳秒和毫秒
Instant ins= Instant.now();
System.out.println("10 位 秒"+ins.getEpochSecond());
System.out.println("13 位 毫秒"+ins.toEpochMilli());
Java 8 中日期与工夫 API 的几个关键点
- 它提供了 javax.time.ZoneId 用来解决时区。
- 它提供了 LocalDate 与 LocalTime 类
- Java 8 中新的工夫与日期 API 中的所有类都是不可变且线程平安的,这与之前的 Date 与 Calendar API 中的恰好相反,那外面像 java.util.Date 以及 SimpleDateFormat 这些要害的类都不是线程平安的。
- 新的工夫与日期 API 中很重要的一点是它定义分明了根本的工夫与日期的概念,比方说,刹时工夫,持续时间,日期,工夫,时区以及时间段。它们都是基于 ISO 日历体系的。
-
每个 Java 开发人员都应该至多理解这套新的 API 中的这五个类:
- Instant 它代表的是工夫戳,比方 2020-01-14T02:20:13.592Z,这能够从 java.time.Clock 类中获取,像这样:Instant current = Clock.system(ZoneId.of(“Asia/Tokyo”)).instant();
- LocalDate 它示意的是不带工夫的日期,比方 2020-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 2020″与”Jan 14 2020″这两个串,而后者如果传进来的是”Jan 2 2020″则会报错,因为它冀望月份处传进来的是两个字符。为了解决这个问题,在天为个位数的状况下,你得在后面补 0,比方”Jan 2 2020″应该改为”Jan 02 2020″。
原文: https://rumenz.com/rumenbiji/java8-java-time.html