背??景Java8已经被广泛使用,但仍然有人使用JavaCalendar来处理时间和日期。不仅性能差,而且代码非常冗余。不能用Java8提供的新API吗?所以CTO强制要求必须使用Java8来处理日期,否则都会被解雇。以下是处理日期的18种方法,可以收藏,一定有用。Java处理日期、日历和时间的方式一直受到社区的批评,将java.util.Date设置为可变类型,SimpleDateFormat的非线程安全性使其应用受到很大限制。新的API基于ISO标准的日历系统,java.time包下的所有类都是不可变的和线程安全的。18个Java8日期处理实践|示例1:在Java8中获取今天的日期Java8中的LocalDate用于表示今天的日期。与java.util.Date不同,它只有日期,没有时间。当您只需要表示日期时使用此类。包com.shxt.demo02;导入java.time.LocalDate;公共类Demo01{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();System.out.println("今天日期:"+today);}}/*运行结果:今天日期:2018-02-05*/|示例2:获取Java8包com.shxt.demo02中的年月日信息;importjava.time.LocalDate;公共类Demo02{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();intyear=today.getYear();intmonth=today.getMonthValue();intday=today.getDayOfMonth();System.out.println("年份:"+年份);System.out.println("月份:"+月份);System.out.println("天:"+天);}}|例3:Java8中,我们可以很方便的通过静态工厂方法now()来创建当天的日期。您还可以调用另一个有用的工厂方法LocalDate.of()来创建任何日期。该方法需要传入年月日作为参数,返回对应的LocalDate实例。这种方式的好处是没有重复旧API的设计错误,比如年从1900开始,月从0开始等等。包com.shxt.demo02;导入java.time.LocalDate;公共类Demo03{publicstaticvoidmain(String[]args){LocalDatedate=LocalDate.of(2018,2,6);System.out.println("自定义日期:"+date);}}|示例4:Java8packagecom.shxt.demo02;importjava.time.LocalDate;publicclassDemo04{publicstaticvoidmain(String[]args){LocalDatedate1=LocalDate.now();判断两个日期是否相等LocalDatedate2=LocalDate.of(2018,2,5);if(date1.equals(date2)){System.out.println("时间等于");}else{System.out.println("时间不同");}}}|示例5:在Java8包com.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包中的当前时间com.shxt.demo02;importjava.time.LocalTime;publicclassDemo06{publicstaticvoidmain(String[]args){LocalTimetime=LocalTime.now();系统。out.println("获取当前时间,不带日期:"+time);}}可以看到当前时间只有时间信息,没有日期。|示例7:在Java8中获取当前时间通常将小时、分钟和秒相加来计算未来时间。除了不可变类型和线程安全的好处,Java8还提供了更好的plusHours()方法来替代add()并且兼容。请注意,这些方法返回一个全新的LocalTime实例,由于其不可变性,返回后必须为其分配一个变量。包com.shxt.demo02;导入java.time.LocalTime;公共类Demo07{publicstaticvoidmain(String[]args){LocalTimetime=LocalTime.now();LocalTimenewTime=time.plusHours(3);系统。out.println("三个小时后的时间是:"+newTime);}}|示例8:Java8如何计算一周后的日期与上例中计算三小时后的时间类似,本例将计算一周后的时间date。LocalDate日期不包含时间信息,其plus()方法用于添加天、周、月,ChronoUnit类声明了这些时间单位。由于LocalDate也是不变类型,返回后必须赋值一个变量。包com.shxt.demo02;导入java.time.LocalDate;导入java.time.temporal.ChronoUnit;公共类Demo08{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();System.out.println("今天的日期是:"+today);LocalDatenextWeek=today.plus(1,ChronoUnit.WEEKS);System.out.println("一周的日期是:"+nextWeek);}}你可以看到Thenewdateis7daysawayfromtoday'sdate,也就是一周。您可以使用相同的方法添加1个月、1年、1小时、1分钟甚至一个世纪。有关更多选项,您可以查看Java8API中的ChronoUnit类。|例9:Java8计算一年前或一年后的日期使用minus()方法计算一年前的日期:packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal。ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUnit.YEARS);System.out.println("一年前日期:"+previousYear);LocalDatenextYear=today.plus(1,ChronoUnit.YEARS);System.out.println("一年后的日期:"+nextYear);}}|示例10:ClockforJava8类Java8添加了一个Clock时钟类,用于获取当前时间戳,或当前时区的日期和时间信息。以前使用System.currentTimeInMillis()和TimeZone.getDefault()的地方,可以改用Clock。packagecom.shxt.demo02;importjava.time.Clock;publicclassDemo10{publicstaticvoidmain(String[]args){//根据您的系统时钟返回当前时间并设置为UTC。时钟时钟=时钟。系统UTC();System.out.println("时钟:"+clock.millis());//返回基于系统时钟区域的时间ClockdefaultClock=Clock.systemDefaultZone();System.out.println("时钟:"+defaultClock.millis());}}|例11:如何用Java判断一个日期早于还是晚于另一个日期工作中另一个常见的操作是如何判断给定的日期是大于某天还是小于某天天?在Java8中,LocalDate类有两个类方法isBefore()和isAfter()用于比较日期。调用isBefore()方法时,如果给定日期小于当前日期,则返回true。包com.shxt.demo02;导入java.time.LocalDate;导入java.time.temporal.ChronoUnit;公共类Demo11{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();LocalDate明天=LocalDate.of(2018,2,6);if(tomorrow.isAfter(today)){System.out.println("Dateafter:"+tomorrow);}LocalDate昨天=today.minus(1,ChronoUnit.DAYS);if(yesterday.isBefore(today)){System.out.println("Datebefore:"+yesterday);}}}|时区是分开的。现在有一系列单独的类,例如处理特定时区的ZoneId和表示特定时区时间的ZoneDateTime类。在Java8之前,这是由GregorianCalendar类完成的。下面的例子展示了如何将这个时区的时间转换为另一个时区的时间。packagecom.shxt.demo02;importjava.time.LocalDateTime;importjava.time.ZoneId;importjava.time.ZonedDateTime;publicclassDemo12{publicstaticvoidmain(String[]args){//带时区的日期和时间在Java8ZoneIdamerica=ZoneId.of("America/New_York");LocalDateTimelocaltDateAndTime=LocalDateTime.now();ZonedDateTimedateAndTimeInNewYork=ZonedDateTime.of(localtDateAndTime,america);System.out.println("特定时区的当前日期和时间:"+dateAndTimeInNewYork);}}|例13:如何表示信用卡过期等固定日期,答案在YearMonth和MonthDay。到期日、FD到期日、期货期权到期日等。您还可以使用此类来获取当月有多少天。YearMonth实例的lengthOfMonth()方法可以返回当月的天数,这在判断二月是否有28天或29天时非常有用。packagecom.shxt.demo02;importjava.time.*;publicclassDemo13{publicstaticvoidmain(String[]args){YearMonthcurrentYearMonth=YearMonth.now();System.out.printf("%s月年天数:%d%n",currentYearMonth,currentYearMonth.lengthOfMonth());YearMonthcreditCardExpiry=YearMonth.of(2019,Month.FEBRUARY);System.out.printf("您的信用卡将于%s%n到期",creditCardExpiry);}}|示例14:如何在Java8packagecom.shxt.demo02;importjava.time.LocalDate;publicclassDemo14中检查闰年if(today.isLeapYear()){System.out.println("今年是闰年");}else{System.out.println("2018年不是闰年");}}}|示例15:计算两个日期之间的天数和月数常见的日期运算是计算两个日期之间的天数、周数或月数。在Java8中,您可以使用java.time.Period类来进行计算。在下面的示例中,我们计算今天和未来某个日期之间的月数。包com.shxt.demo02;导入java.time.LocalDate;导入java.time.Period;公共类Demo15{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();LocalDatejava8Release=LocalDate.的(2018,12,14);PeriodperiodToNextJavaRelease=Period.between(today,java8Release);System.out.println("从今天到Java8发布还剩几个月:"+periodToNextJavaRelease.getMonths());}}|示例16:Java8获取当前时间戳Instant类有一个静态工厂方法now()返回当前时间戳,如下:packagecom.shxt.demo02;importjava.time.Instant;publicclassDemo16{publicstaticvoidmain(String[]args){Instanttimestamp=Instant.now();System.out.println("这个瞬间的价值是多少"+timestamp.toEpochMilli());}}时间戳信息中还包含了日期和时间,这一点和java.util.Date很相似。事实上,Instant类确实等同于Java8之前的Date类,可以使用Date类和Instant类各自的转换方法相互转换。例如:Date.from(Instant)将Instant转换为java.util.Date,Date.toInstant()将Date类转换为Instant类。|示例17:如何使用预定义的格式化工具解析或格式化Java8包中的日期com.shxt.demo02;importjava.time.LocalDate;importjava.time.format.DateTimeFormatter;publicclassDemo17{publicstaticvoidmain(String[]args){StringdayAfterTomorrow="20180205";LocalDate格式化=LocalDate.parse(dayAfterTommorrow,DateTimeFormatter.BASIC_ISO_DATE);System.out.println(dayAfterTommorrow+"格式化日期为:"+formatted);}}|示例18:将字符串转换为日期类型args){LocalDateTimedate=LocalDateTime.now();DateTimeFormatterformat1=DateTimeFormatter.ofPattern("yyyy/MM/ddHH:mm:ss");//日期到字符串Stringstr=date.format(format1);System.out.println("日期转换为字符串:"+str);DateTimeFormatter格式2=DateTimeFormatter.ofPattern("yyyy/MM/ddHH:mm:ss");//字符串到日期LocalDatedate2=LocalDate.parse(str,format2);System.out.println("日期类型:"+date2);}}来源:juejin.cn/post/6937888716438372389
