|
|
51CTO旗下网站
|
|
移步端
  • 18个Java8日期处理的实行,太有用了!

    Java 8 生产了崭新的日子时间API,在学科中我们将穿越一些简单的范例来学习如何运用新API。

    笔者:胖先森​ 来源:Java知音| 2020-01-15 15:12

    Java 8 生产了崭新的日子时间API,在学科中我们将穿越一些简单的范例来学习如何运用新API。

    Java拍卖日期、年历和时间之措施一直为灾区所诟病,名将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全大使他使用非常受限。

    新API基于ISO专业日历系统,java.time包下之一切类都是不可变类型而且线程安全。

    示例1:Java 8官方获取今天的日子

    Java 8 中的 LocalDate 用于表示当天日期。和java.util.Date不同,他只有日期,不包含时间。顶你仅需要表示日期时就用这个类。

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDate;  
    3. public class Demo01 {  
    4.     public static void main(String[] args) {  
    5.         LocalDate today = LocalDate.now();  
    6.         System.out.println("当日的日子:"+today);  
    7.     }  

    示例2:Java 8官方获取年、月、日信息

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDate;  
    3. public class Demo02 {  
    4.     public static void main(String[] args) {  
    5.         LocalDate today = LocalDate.now();  
    6.         int year = today.getYear();  
    7.         int month = today.getMonthValue();  
    8.         int day = today.getDayOfMonth();  
    9.         System.out.println("year:"+year);  
    10.         System.out.println("month:"+month);  
    11.         System.out.println("day:"+day);  
    12.     }  

    示例3:Java 8官方处理特定日期

    咱们通过静态工厂方法now()异常容易地创造了今天日期,你还可以选用另一番有用之厂子方法LocalDate.of()创造任意日期, 该方法需要传入年、月、日做参数,回到对应的LocalDate老。其一艺术的功利是没再犯老API的计划不当,比如年度起始于1900,岁首是副0开 始等等。

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDate;  
    3. public class Demo03 {  
    4.     public static void main(String[] args) {  
    5.         LocalDate date = LocalDate.of(2018,2,6);  
    6.         System.out.println("自定义日期:"+date);  
    7.     }  

    示例4:Java 8官方判断两个日子是否相等

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDate; 
    3. public class Demo04 {  
    4.     public static void main(String[] args) {  
    5.         LocalDate date1 = LocalDate.now();  
    6.         LocalDate date2 = LocalDate.of(2018,2,5);  
    7.         if(date1.equals(date2)){  
    8.             System.out.println("时光相等");  
    9.         }else{ 
    10.              System.out.println("时光不等");  
    11.         }  
    12.     }  

    示例5:Java 8官方检查像生日这种必然性事件

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDate;  
    3. import java.time.MonthDay;  
    4. public class Demo05 {  
    5.     public static void main(String[] args) {  
    6.         LocalDate date1 = LocalDate.now();  
    7.         LocalDate date2 = LocalDate.of(2018,2,6);  
    8.         MonthDay birthday = MonthDay.of(date2.getMonth(),date2.getDayOfMonth());  
    9.         MonthDay currentMonthDay = MonthDay.from(date1);  
    10.         if(currentMonthDay.equals(birthday)){  
    11.             System.out.println("是你的生辰");  
    12.         }else{  
    13.             System.out.println("你的生辰还没有到");  
    14.         }  
    15.     }  

    只要当天的日子和生日匹配,不论哪一年都会打印出祝贺信息。你可以把程序整合进系统时钟,探望生日时是否会受到提醒,或者写一个毫安测试来探测代码是否运行正确。

    示例6:Java 8官方获取当前时间

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalTime;  
    3. public class Demo06 {  
    4.     public static void main(String[] args) {  
    5.         LocalTime time = LocalTime.now();  
    6.         System.out.println("获取当前的年华,不含有日期:"+time);  
    7.     }  

    可以看出眼前时间就只包含时间信息,没有日期

    示例7:Java 8官方获取当前时间

    穿过增加小时、成分、秒来计算将来的年华很常见。Java 8除了不变类型和线程安全之功利之外,还提供了更好的plusHours()办法替换add(),并且是兼容的。瞩目,该署办法返回一个崭新的LocalTime老,出于他不可变性,回到下一定要用变量赋值。

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalTime;  
    3. public class Demo07 {  
    4.     public static void main(String[] args) {  
    5.         LocalTime time = LocalTime.now();  
    6.         LocalTime newTime = time.plusHours(3);  
    7.         System.out.println("三个小时以后的年华为:"+newTime);   
    8.     }  

    示例8:Java 8如何计算一周下的日子

    和上个比喻计算3小时后的年华类似,其一例子会计算一周下的日子。LocalDate日期不包含时间信息,他的plus()办法用来充实天、周、月,ChronoUnit类声明了那些日子单位。出于LocalDate也是一成不变类型,回到下一定要用变量赋值。

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDate;  
    3. import java.time.temporal.ChronoUnit;  
    4. public class Demo08 {  
    5.     public static void main(String[] args) {  
    6.         LocalDate today = LocalDate.now();  
    7.         System.out.println("当日的日子为:"+today);  
    8.         LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);  
    9.         System.out.println("一周下的日子为:"+nextWeek);  
    10.     }  

    可以看出新日期离当天日期是7远处,也就是一周。你可以用同样的主意增加1个月、1年、1小时、1分钟甚至一个世纪,更多选项可以查看Java 8 API中的ChronoUnit类

    示例9:Java 8计算一年前或一年以后的日子

    采取minus()办法计算一年前的日子

          
    1. package com.shxt.demo02; 
    2. import java.time.LocalDate;  
    3. import java.time.temporal.ChronoUnit;  
    4. public class Demo09 {  
    5.     public static void main(String[] args) { 
    6.         LocalDate today = LocalDate.now();  
    7.         LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);  
    8.         System.out.println("一年前的日子 : " + previousYear);  
    9.         LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);  
    10.         System.out.println("一年以后的日子:"+nextYear);  
    11.     }  

    示例10:Java 8的Clock时钟类

    Java 8增长了一番Clock时钟类用于获取当时的年华戳,或当前时区下的日子时间信息。此前用到System.currentTimeInMillis()和TimeZone.getDefault()的中央都适用Clock替换。

          
    1. package com.shxt.demo02;  
    2. import java.time.Clock;  
    3. public class Demo10 {  
    4.     public static void main(String[] args) {  
    5.         // Returns the current time based on your system clock and set to UTC.  
    6.         Clock clock = Clock.systemUTC();  
    7.         System.out.println("Clock : " + clock.millis());  
    8.         // Returns time based on system clock zone  
    9.         Clock defaultClock = Clock.systemDefaultZone();  
    10.         System.out.println("Clock : " + defaultClock.millis());  
    11.     }  

    示例11:如何用Java认清日期是早于还是晚于另一番日期

    另一番工作中广泛的借鉴就是如何判断给定的一个日期是大于某天还是小于某天?在Java 8官方,LocalDate类有两类方法isBefore()和isAfter()用于比较日期。租用isBefore()办法时,如果给定日期小于当前日期则赶回true。

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDate;  
    3. import java.time.temporal.ChronoUnit;  
    4. public class Demo11 {  
    5.     public static void main(String[] args) {  
    6.         LocalDate today = LocalDate.now();  
    7.         LocalDate tomorrow = LocalDate.of(2018,2,6);  
    8.         if(tomorrow.isAfter(today)){  
    9.             System.out.println("后的日子:"+tomorrow);  
    10.         }  
    11.         LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);  
    12.         if(yesterday.isBefore(today)){  
    13.             System.out.println("先前的日子:"+yesterday);  
    14.         }  
    15.     }  

    示例12:Java 8官方处理时区

    Java 8不仅分离了日期和时间,也把时区分离出来了。如今有一系列单独的类如ZoneId来处理特定时区,ZoneDateTime类来表示某时区下的年华。这在Java 8此前都是 GregorianCalendar类来做的。下这个例子展示了如何把资产时区的年华转换成另一番时区的年华。

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDateTime;  
    3. import java.time.ZoneId;  
    4. import java.time.ZonedDateTime;  
    5. public class Demo12 {  
    6.     public static void main(String[] args) {  
    7.         // Date and time with timezone in Java 8  
    8.         ZoneId america = ZoneId.of("America/New_York");  
    9.         LocalDateTime localtDateAndTime = LocalDateTime.now();  
    10.         ZonedDateTime dateAndTimeInNewYork  = ZonedDateTime.of(localtDateAndTime, america );  
    11.         System.out.println("Current date and time in a particular timezone : " + dateAndTimeInNewYork);  
    12.     }  

    示例13:如何表示信用卡到期这类固定日期,答案就在YearMonth

    与 MonthDay检查重复事件的例证相似,YearMonth是另一番组合类,用于表示信用卡到期日、FD到时日、期货期权到期日等。还可以用这个类得到 斋月共有好多天,YearMonth老的lengthOfMonth()办法可以返回当月的命运,在判断2月有28远处还是29数非常有用。

          
    1. package com.shxt.demo02;  
    2. import java.time.*;  
    3. public class Demo13 {  
    4.     public static void main(String[] args) {  
    5.         YearMonth currentYearMonth = YearMonth.now();  
    6.         System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());  
    7.         YearMonth creditCardExpiry = YearMonth.of(2019, Month.FEBRUARY);  
    8.         System.out.printf("Your credit card expires on %s %n", creditCardExpiry);  
    9.     }  

    示例14:如何在Java 8官方检查闰年

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDate;  
    3. public class Demo14 {  
    4.     public static void main(String[] args) {  
    5.         LocalDate today = LocalDate.now();  
    6.         if(today.isLeapYear()){  
    7.             System.out.println("This year is Leap year");  
    8.         }else {  
    9.             System.out.println("2018 is not a Leap year");  
    10.         }  
    11.     }  

    示例15:计算两个日子之间的命运和月数

    有一度常见日期操作是计算两个日子之间的命运、周数或月数。在Java 8官方得以用java.time.Period类来做计算。

    下这个例子中,咱们计算了今天和前某一天之间的月数。

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDate;  
    3. import java.time.Period;  
    4. public class Demo15 {  
    5.     public static void main(String[] args) {  
    6.         LocalDate today = LocalDate.now();  
    7.         LocalDate java8Release = LocalDate.of(2018, 12, 14);  
    8.         Period periodToNextJavaRelease = Period.between(today, java8Release);  
    9.         System.out.println("Months left between today and Java 8 release : "  
    10.                 + periodToNextJavaRelease.getMonths() );    
    11.     }  

    示例16:在Java 8官方获取当前的年华戳

    Instant类有一度静态工厂方法now()会回来当前的年华戳,如下所示:

          
    1. package com.shxt.demo02;   
    2. import java.time.Instant;  
    3. public class Demo16 {  
    4.     public static void main(String[] args) {  
    5.         Instant timestamp = Instant.now();  
    6.         System.out.println("What is value of this instant " + timestamp.toEpochMilli());  
    7.     }  

    时光戳信息里同时包含了日期和时间,这和java.util.Date很像。实际上Instant类确实等同于 Java 8先前的Date类,你可以运用Date类和Instant类各自的更换方法互相转换,例如:Date.from(Instant) 名将Instant转移成java.util.Date,Date.toInstant()则是将Date类转换成Instant类。

    示例17:Java 8官方如何运用预定义的格式化工具去解析或格式化日期

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDate;  
    3. import java.time.format.DateTimeFormatter;  
    4. public class Demo17 {  
    5.     public static void main(String[] args) {  
    6.         String dayAfterTommorrow = "20180205" 
    7.         LocalDate formatted = LocalDate.parse(dayAfterTommorrow,  
    8.                 DateTimeFormatter.BASIC_ISO_DATE);  
    9.         System.out.println(dayAfterTommorrow+"  格式化后的日子为:  "+formatted);  
    10.     }  

    示例18:字符串互转日期类型

          
    1. package com.shxt.demo02;  
    2. import java.time.LocalDate;  
    3. import java.time.LocalDateTime;  
    4. import java.time.format.DateTimeFormatter;  
    5. public class Demo18 {  
    6.     public static void main(String[] args) {  
    7.         LocalDateTime date = LocalDateTime.now();  
    8.         DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");  
    9.         //日期转字符串  
    10.         String str = date.format(format1);  
    11.         System.out.println("日期转换为字符串:"+str);  
    12.         DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");  
    13.         //字符串转日期  
    14.         LocalDate date2 = LocalDate.parse(str,format2);  
    15.         System.out.println("日期类型:"+date2);  
    16.     }  
    17.  
    【义务编辑: 庞桂玉 TEL:(010)68476606】

    点赞 0
  • Java8  日期处理  代码
  • 分享:
    大家都在看
    猜你喜欢
  • 订阅专栏+更多

    Python使用场景实战手册

    Python使用场景实战手册

    Python使用场景实战手册
    共3章 | KaliArch

    116人口订阅学习

    一步到位玩儿透Ansible

    一步到位玩儿透Ansible

    Ansible
    共17章 | 骏马金龙1

    184人口订阅学习

    云架构师修炼手册

    云架构师修炼手册

    云架构师之必不可少技能
    共3章 | Allen在路上

    131人口订阅学习

    读 书 +更多

    Linux专业教程

    资本书以Linux Redhat 9.0成人版为基础编写,副易用性和完整性角度出发主要介绍Linux Redhat 9.0成人版的使用知识,穿过资本书的读书,相信初中...

    订阅51CTO邮刊

    点击这里查看样刊

    订阅51CTO邮刊

    51CTO劳务号

    51CTO官微


  • 
       
        
       
       
  • 
       
       
       
  •