Java 8新时间日期库java.time的使用示例
- Instant——它代表的是时间戳
- LocalDate——不包含具体时间的日期,比如2020-01-14。它可以用来存储生日,周年纪念日,入职日期等。
- LocalTime——它代表的是不含日期的时间
- LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。
- ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。
Java8是如何处理时间及日期的
示例1如何在Java8中获取当天的日期
LocalDatetoday=LocalDate.now();
System.out.println("Today'sLocaldate:"+today);
Output
Today'sLocaldate:2020-01-14
示例2如何在Java8中获取当前的年月日
LocalDatetoday=LocalDate.now();
intyear=today.getYear();
intmonth=today.getMonthValue();
intday=today.getDayOfMonth();
System.out.printf("Year:%dMonth:%dday:%d\t%n",year,month,day);
Output
Today'sLocaldate:2020-01-14
Year:2020Month:1day:14
示例3在Java8中如何获取某个特定的日期
LocalDatedateOfBirth=LocalDate.of(2010,01,14);
System.out.println("YourDateofbirthis:"+dateOfBirth);
Output:YourDateofbirthis:2010-01-14
示例4在Java8中如何检查两个日期是否相等
LocalDatedate1=LocalDate.of(2020,01,14);if(date1.equals(today)){
System.out.printf("Today%sanddate1%saresamedate%n",today,date1);
}
Output
today2020-01-14anddate12020-01-14aresamedate
示例5在Java8中如何检查重复事件,比如说生日
LocalDatedateOfBirth=LocalDate.of(2010,01,14);
MonthDaybirthday=MonthDay.of(dateOfBirth.getMonth(),dateOfBirth.getDayOfMonth());
MonthDaycurrentMonthDay=MonthDay.from(today);
if(currentMonthDay.equals(birthday)){
System.out.println("ManyManyhappyreturnsoftheday!!");
}else{
System.out.println("Sorry,todayisnotyourbirthday");
}
Output:ManyManyhappyreturnsoftheday!!
示例6如何在Java8中获取当前时间
LocalTimetime=LocalTime.now();
System.out.println("localtimenow:"+time);
Output
localtimenow:16:33:33.369//inhour,minutes,seconds,nanoseconds
示例7如何增加时间里面的小时数
LocalTimetime=LocalTime.now();
LocalTimenewTime=time.plusHours(2);//addingtwohours
System.out.println("Timeafter2hours:"+newTime);
Output:
Timeafter2hours:18:33:33.369
示例8如何获取1周后的日期
LocalDatenextWeek=today.plus(1,ChronoUnit.WEEKS);
System.out.println("Todayis:"+today);
System.out.println("Dateafter1week:"+nextWeek);
Output:
Todayis:2020-01-14
Dateafter1week:2020-01-21
示例9一年前后的日期
LocalDatepreviousYear=today.minus(1,ChronoUnit.YEARS);
System.out.println("Datebefore1year:"+previousYear);
LocalDatenextYear=today.plus(1,YEARS);
System.out.println("Dateafter1year:"+nextYear);
Output:
Datebefore1year:2019-01-14
Dateafter1year:2021-01-14
示例10在Java8中使用时钟
//ReturnsthecurrenttimebasedonyoursystemclockandsettoUTC.
Clockclock=Clock.systemUTC();
System.out.println("Clock:"+clock);
//ReturnstimebasedonsystemclockzoneClockdefaultClock=
Clock.systemDefaultZone();
System.out.println("Clock:"+clock);
Output:
Clock:SystemClock[Z]
Clock:SystemClock[Z]
publicclassMyClass{
privateClockclock;//dependencyinject...
publicvoidprocess(LocalDateeventDate){
if(eventDate.isBefore(LocalDate.now(clock)){
...
}
}
}
示例11在Java中如何判断某个日期是在另一个日期的前面还是后面
LocalDatetomorrow=LocalDate.of(2020,1,15);
if(tommorow.isAfter(today)){
System.out.println("Tomorrowcomesaftertoday");
}
LocalDateyesterday=today.minus(1,DAYS);
if(yesterday.isBefore(today)){
System.out.println("Yesterdayisdaybeforetoday");
}
Output:
Tomorrowcomesaftertoday
Yesterdayisdaybeforetoday
示例12在Java8中处理不同的时区
//DateandtimewithtimezoneinJava8ZoneIdamerica=ZoneId.of("America/New_York");
LocalDateTimelocaltDateAndTime=LocalDateTime.now();
ZonedDateTimedateAndTimeInNewYork=ZonedDateTime.of(localtDateAndTime,america);
System.out.println("Currentdateandtimeinaparticulartimezone:"+dateAndTimeInNewYork);
Output:
Currentdateandtimeinaparticulartimezone:2020-01-14T16:33:33.373-05:00[America/New_York]
Exceptioninthread"main"java.time.zone.ZoneRulesException:Unknowntime-zoneID:ASIA/Tokyo
atjava.time.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:272)
atjava.time.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:227)
atjava.time.ZoneRegion.ofId(ZoneRegion.java:120)
atjava.time.ZoneId.of(ZoneId.java:403)
atjava.time.ZoneId.of(ZoneId.java:351)
示例13如何表示固定的日期,比如信用卡过期时间
YearMonthcurrentYearMonth=YearMonth.now();
System.out.printf("Daysinmonthyear%s:%d%n",currentYearMonth,currentYearMonth.lengthOfMonth());
YearMonthcreditCardExpiry=YearMonth.of(2018,Month.FEBRUARY);
System.out.printf("Yourcreditcardexpireson%s%n",creditCardExpiry);
Output:
Daysinmonthyear2020-01:31
Yourcreditcardexpireson2018-02
示例14如何在Java8中检查闰年
if(today.isLeapYear()){
System.out.println("ThisyearisLeapyear");
}else{
System.out.println("2020isnotaLeapyear");
}
Output:2020isnotaLeapyear
示例15两个日期之间包含多少天,多少个月
LocalDatejava8Release=LocalDate.of(2020,Month.MARCH,14);
PeriodperiodToNextJavaRelease=Period.between(today,java8Release);
System.out.println("MonthsleftbetweentodayandJava8release:"+periodToNextJavaRelease.getMonths());
Output:
MonthsleftbetweentodayandJava8release:2
示例16带时区偏移量的日期与时间
LocalDateTimedatetime=LocalDateTime.of(2020,Month.JANUARY,14,19,30);
ZoneOffsetoffset=ZoneOffset.of("+05:30");
OffsetDateTimedate=OffsetDateTime.of(datetime,offset);
System.out.println("DateandTimewithtimezoneoffsetinJava:"+date);
Output:
DateandTimewithtimezoneoffsetinJava:2020-01-14T19:30+05:30
示例17在Java8中如何获取当前时间戳
Instanttimestamp=Instant.now();
System.out.println("Whatisvalueofthisinstant"+timestamp);
Output:
Whatisvalueofthisinstant2020-01-14T08:33:33.379Z
示例18如何在Java8中使用预定义的格式器来对日期进行解析/格式化
StringdayAfterTommorrow="20200116";
LocalDateformatted=LocalDate.parse(dayAfterTommorrow,
DateTimeFormatter.BASIC_ISO_DATE);
System.out.printf("DategeneratedfromString%sis%s%n",dayAfterTommorrow,formatted);
Output:
DategeneratedfromString20200116is2020-01-16
示例19如何在Java中使用自定义的格式器来解析日期
StringgoodFriday="Apr182020";
try{
DateTimeFormatterformatter=DateTimeFormatter.ofPattern("MMMddyyyy");
LocalDateholiday=LocalDate.parse(goodFriday,formatter);
System.out.printf("SuccessfullyparsedString%s,dateis%s%n",goodFriday,holiday);
}catch(DateTimeParseExceptionex){
System.out.printf("%sisnotparsable!%n",goodFriday);
ex.printStackTrace();
}
Output:
SuccessfullyparsedStringApr182020,dateis2020-04-18
示例20如何在Java8中对日期进行格式化,转换成字符串
LocalDateTimearrivalDate=LocalDateTime.now();
try{
DateTimeFormatterformat=DateTimeFormatter.ofPattern("MMMddyyyyhh:mma");
Stringlanding=arrivalDate.format(format);
System.out.printf("Arrivingat:%s%n",landing);
}catch(DateTimeExceptionex){
System.out.printf("%scan'tbeformatted!%n",arrivalDate);
ex.printStackTrace();
}
Output:Arrivingat:Jan14202004:33PM
示例21获取时间戳秒和毫秒
Instantins=Instant.now();
System.out.println("10位秒"+ins.getEpochSecond());
System.out.println("13位毫秒"+ins.toEpochMilli());
Java8中日期与时间API的几个关键点
- 它提供了javax.time.ZoneId用来处理时区。
- 它提供了LocalDate与LocalTime类
- Java8中新的时间与日期API中的所有类都是不可变且线程安全的,这与之前的Date与CalendarAPI中的恰好相反,那里面像java.util.Date以及SimpleDateFormat这些关键的类都不是线程安全的。
- 新的时间与日期API中很重要的一点是它定义清楚了基本的时间与日期的概念,比方说,瞬时时间,持续时间,日期,时间,时区以及时间段。它们都是基于ISO日历体系的。
- 每个Java开发人员都应该至少了解这套新的API中的这五个类:
- Instant它代表的是时间戳,比如2020-01-14T02:20:13.592Z,这可以从java.time.Clock类中获取,像这样:Instantcurrent=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异常。
- 再说一句,“MMMdyyyy”与“MMmddyyyy”这两个日期格式也略有不同,前者能识别出”Jan22020″与”Jan142020″这两个串,而后者如果传进来的是”Jan22020″则会报错,因为它期望月份处传进来的是两个字符。为了解决这个问题,在天为个位数的情况下,你得在前面补0,比如”Jan22020″应该改为”Jan022020″。
总结
到此这篇关于Java8新时间日期库java.time使用的文章就介绍到这了,更多相关Java8新时间日期库java.time内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!