当前位置: 首页 > 科技观察

18个Java8日期处理实践,太实用了!

时间:2023-03-15 14:19:17 科技观察

Java8引入了一个新的日期和时间API,在本教程中我们将通过一些简单的例子来学习如何使用新的API。Java处理日期、日历和时间的方式一直受到社区的批评。将java.util.Date设置为变量类型以及SimpleDateFormat的非线程安全性使其应用受到很大限制。新的API基于ISO标准的日历系统,java.time包下的所有类都是不可变的和线程安全的。示例1:在Java8中获取今天的日期Java8中的LocalDate用于表示今天的日期。与java.util.Date不同,它只有日期,没有时间。当您只需要表示日期时使用此类。packagecom.shxt.demo02;importjava.time.LocalDate;publicclassDemo01{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();System.out.println("今天的日期:"+today);}}示例2:获取Java8包中的年月日信息=today.getMonthValue();intday=today.getDayOfMonth();System.out.println("year:"+year);System.out.println("month:"+month);System.out.println("day:"+day);}}示例3:在Java8中处理特定日期我们可以通过静态工厂方法now()轻松创建今天的日期,也可以调用另一个有用的工厂方法LocalDate.of()来创建任何日期,该方法都需要传入年月日作为参数,并返回对应的LocalDate实例。这种方式的好处是没有重复旧API的设计错误,比如年从1900开始,月从0开始等等。packagecom.shxt.demo02;importjava.time.LocalDate;publicclassDemo03{publicstaticvoidmain(String[]args){LocalDatedate=LocalDate.of(2018,2,6);System.out.println("自定义日期:"+date);}}示例4:Java8判断两个日期是否相等(2018,2,5);if(date1.equals(date2)){System.out.println("Timeisequal");}else{System.out.println("Timeisnotequal");}}}示例5:在Java8packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.MonthDay;publicclassDemo05{publicstaticvoidmain(String[]args){LocalDatedate1=LocalDate.now();LocalDatedate2=LocalDate.of(2018,2,6);MonthDaybirthday=MonthDay.of(date2.getMonth(),date2.getDayOfMonth());MonthDaycurrentMonthDay=MonthDay.from(date1);if(currentMonthDay.equals(birthday)){System.out.println("今天是你的生日");}else{System.out.println("你的生日还没到");}}}只要当天的日期与您的生日相符,无论是哪一天每年都会印制贺词。你可以将程序集成到系统时钟中,看看生日到了会不会提醒你,或者写一个单元测试来检查代码是否正确运行。例6:在Java8中获取当前时间time,doesnotcontaindate:"+time);}}可以看到当前时间只包含时间信息,没有date例7:在Java8中,通过小时、分钟、和秒来获取当前时间。除了不可变类型和线程安全的好处之外,Java8还提供了更好的plusHours()方法来替代add()并且兼容。请注意,这些方法返回一个全新的LocalTime实例。由于其不可变性,变量必须在返回后赋值。packagecom.shxt.demo02;importjava.time.LocalTime;publicclassDemo07{publicstaticvoidmain(String[]args){LocalTimetime=LocalTime.now();LocalTimenewTime=time.plusHours(3);System.out.println("三小时后timeis:"+newTime);}}例8:Java8计算一周后的日期和前面例子计算3小时??后的时间类似,本例计算一周后的日期。LocalDate日期不包含时间信息。它的plus()方法用于添加天、周和月。ChronoUnit类声明了这些时间单位。由于LocalDate也是不变类型,返回后必须赋值一个变量。packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo08{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();System.out.println("今天的日期是:"+today);LocalDatenextWeek=today.plus(1,ChronoUnit.WEEKS);System.out.println("一周后的日期是:"+nextWeek);}}可以看到新的日期距离7天当前日期,即一周。您可以使用相同的方法添加1个月、1年、1小时、1分钟甚至一个世纪。更多选项可以查看Java8API中的ChronoUnit类例9:Java8计算一年前或一年后的日期使用minus()方法计算一年前的日期=today.minus(1,ChronoUnit.YEARS);System.out.println("一年前的日期:"+previousYear);LocalDatenextYear=today.plus(1,ChronoUnit.YEARS);System.out.println("一年后的日期:"+nextYear);}}示例10:Java8的Clock类Java8新增了一个Clock类,用于获取当时的时间戳,或者当前时区的日期时间信息。之前用System.currentTimeInMillis()和TimeZone.getDefault()的地方,可以用Clock代替。packagecom.shxt.demo02;importjava.time.Clock;publicclassDemo10{publicstaticvoidmain(String[]args){//根据你的系统时钟返回当前时间并设置为UTC.Clockclock=Clock.systemUTC();System.out。println("Clock:"+clock.millis());//返回时间基于systemclockzoneClockdefaultClock=Clock.systemDefaultZone();System.out.println("Clock:"+defaultClock.millis());}}示例11:如何使用Java判断一个日期早于还是晚于另一个日期工作中一个常见的操作就是如何判断给定的日期是大于还是小于某一天?在Java8中,LocalDate类有两个方法isBefore()和isAfter()用于比较日期。调用isBefore()方法时,如果给定日期小于当前日期,则返回true。packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo11{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();LocalDatetomorrow=LocalDate.of(2018,2,6));if(tomorrow.isAfter(today)){System.out.println("Dateafter:"+tomorrow);}LocalDateyesterday=today.minus(1,ChronoUnit.DAYS);if(yesterday.isBefore(today)){System.out.println("Datebefore:"+yesterday);}}}例12:Java8中的时区处理Java8不仅把日期和时间分开了,还把时区分开了。现在有一系列单独的类,比如ZoneId来处理特定的时区,ZoneDateTime来表示某个时区的时间。这是Java8之前的GregorianCalendar类完成的。下面的例子展示了如何将这个时区的时间转换成另一个时区的时间。packagecom.shxt.demo02;importjava.time.LocalDateTime;importjava.time.ZoneId;importjava.time.ZonedDateTime;publicclassDemo12{publicstaticvoidmain(String[]args){//DateandtimewithtimezoneinJava8ZoneIdamerica=ZoneId.of("America/New_York");LocalDateTimelocaltDateAndTime=LocalDateTime.now();ZonedDateTimedateAndTimeInNewYork=ZonedDateTime.of(localtDateAndTime,america);System.out.println("Currentdateandtimeinaparticulartimezone:"+dateAndTimeInNewYork);}}示例13:如何表示固定日期,例如信用卡到期日,答案在于与MonthDay检查重复事件的例子类似,YearMonth是另一个复合类,用于表示信用卡到期日、FD到期日、期货期权到期日等。您还可以使用该类来获取多少天当月有。YearMonth实例的lengthOfMonth()方法可以返回当月的天数,这在判断二月是否有28天或29天时非常有用。packagecom.shxt.demo02;importjava.time.*;publicclassDemo13{publicstaticvoidmain(String[]args){YearMonthcurrentYearMonth=YearMonth.now();System.out.printf("Daysinmonthyear%s:%d%n",currentYearMonth,currentYearMonth.lengthOfMonth());YearMonthcreditCardExpiry=YearMonth.of(2019,Month.FEBRUARY);System.out.printf("Yourcreditcardexpireson%s%n",creditCardExpiry);}}示例14:如何在Java8packagecom中检查闰年。shxt.demo02;importjava.time.LocalDate;publicclassDemo14{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();if(today.isLeapYear()){System.out.println("ThisyearisLeapyear");}else{System.out.println("2018isnotaLeapyear");}}}例15:计算两个日期之间的天数和月数常见的日期操作是计算两个日期之间的天数、周数或月数。在Java8中,您可以使用java.time.Period类来进行计算。在下面的示例中,我们计算今天和未来某个日期之间的月数。packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.Period;publicclassDemo15{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();LocalDatejava8Release=LocalDate.of(2018,12,14);PeriodperiodToNextJavaRelease=Period.between(today,java8Release);System.out.println("MonthsleftbetweentodayandJava8release:"+periodToNextJavaRelease.getMonths());}}例子16:在Java8中获取当前时间戳Instant类现在有一个静态工厂方法()会返回当前的时间戳,如下:timestamp.toEpochMilli());}}时间戳信息包含日期和时间,与java.util.Date非常相似。事实上,Instant类确实等同于Java8之前的Date类,可以使用Date类和Instant类的转换方法相互转换,例如:Date.from(Instant)将Instant转换为java。util.Date、Date.toInstant()是将Date类转化为Instant类。示例17:如何使用Java8中预定义的格式化工具来解析或格式化日期20180205";LocalDateformatted=LocalDate.parse(dayAfterTommorrow,DateTimeFormatter.BASIC_ISO_DATE);System.out.println(dayAfterTommorrow+"格式化日期为:"+formatted);}}例18:字符串转换日期类型packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassDemo18{publicstaticvoidmain(String[]args){LocalDateTimedate=LocalDateTime.now();DateTimeFormatterformat1=DateTimeFormatter.ofPattern("yyyy/MM/ddHH:mm:ss");//日期转字符串Stringstr=date.format(format1);System.out.println("日期转字符串:"+str);DateTimeFormatterformat2=DateTimeFormatter.ofPattern("yyyy/MM/ddHH:mm:ss");//字符串到日期LocalDatedate2=LocalDate.parse(str,format2);System.out.println("datetype:"+date2);}}