热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

18个Java8日期处理的实践(太有用了)

这篇文章主要介绍了18个Java8日期处理的实践(太有用了),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。

Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。

新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。

示例1:Java 8中获取今天的日期

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

package com.shxt.demo02; 
import java.time.LocalDate; 
public class Demo01 { 
  public static void main(String[] args) { 
    LocalDate today = LocalDate.now(); 
    System.out.println("今天的日期:"+today); 
  } 
} 

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

package com.shxt.demo02; 
import java.time.LocalDate; 
public class Demo02 { 
  public static void main(String[] args) { 
    LocalDate today = LocalDate.now(); 
    int year = today.getYear(); 
    int mOnth= today.getMonthValue(); 
    int day = today.getDayOfMonth(); 
    System.out.println("year:"+year); 
    System.out.println("month:"+month); 
    System.out.println("day:"+day); 
  } 
} 

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

我们通过静态工厂方法now()非常容易地创建了当天日期,你还可以调用另一个有用的工厂方法LocalDate.of()创建任意日期, 该方法需要传入年、月、日做参数,返回对应的LocalDate实例。这个方法的好处是没再犯老API的设计错误,比如年度起始于1900,月份是从0开 始等等。

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

示例4:Java 8中判断两个日期是否相等

package com.shxt.demo02; 
import java.time.LocalDate; 
public class Demo04 { 
  public static void main(String[] args) { 
    LocalDate date1 = LocalDate.now(); 
    LocalDate date2 = LocalDate.of(2018,2,5); 
    if(date1.equals(date2)){ 
      System.out.println("时间相等"); 
    }else{ 
       System.out.println("时间不等"); 
    } 
  } 
} 

示例5:Java 8中检查像生日这种周期性事件

package com.shxt.demo02; 
import java.time.LocalDate; 
import java.time.MonthDay; 
public class Demo05 { 
  public static void main(String[] args) { 
    LocalDate date1 = LocalDate.now(); 
    LocalDate date2 = LocalDate.of(2018,2,6); 
    MonthDay birthday = MonthDay.of(date2.getMonth(),date2.getDayOfMonth()); 
    MonthDay currentMOnthDay= MonthDay.from(date1); 
    if(currentMonthDay.equals(birthday)){ 
      System.out.println("是你的生日"); 
    }else{ 
      System.out.println("你的生日还没有到"); 
    } 
  } 
} 

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

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

package com.shxt.demo02; 
import java.time.LocalTime; 
public class Demo06 { 
  public static void main(String[] args) { 
    LocalTime time = LocalTime.now(); 
    System.out.println("获取当前的时间,不含有日期:"+time); 
  } 
} 

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

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

通过增加小时、分、秒来计算将来的时间很常见。Java 8除了不变类型和线程安全的好处之外,还提供了更好的plusHours()方法替换add(),并且是兼容的。注意,这些方法返回一个全新的LocalTime实例,由于其不可变性,返回后一定要用变量赋值。

package com.shxt.demo02; 
import java.time.LocalTime; 
public class Demo07 { 
  public static void main(String[] args) { 
    LocalTime time = LocalTime.now(); 
    LocalTime newTime = time.plusHours(3); 
    System.out.println("三个小时后的时间为:"+newTime);  
  } 
} 

示例8:Java 8如何计算一周后的日期

和上个例子计算3小时以后的时间类似,这个例子会计算一周后的日期。LocalDate日期不包含时间信息,它的plus()方法用来增加天、周、月,ChronoUnit类声明了这些时间单位。由于LocalDate也是不变类型,返回后一定要用变量赋值。

package com.shxt.demo02; 
import java.time.LocalDate; 
import java.time.temporal.ChronoUnit; 
public class Demo08 { 
  public static void main(String[] args) { 
    LocalDate today = LocalDate.now(); 
    System.out.println("今天的日期为:"+today); 
    LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); 
    System.out.println("一周后的日期为:"+nextWeek); 
  } 
} 

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

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

利用minus()方法计算一年前的日期

package com.shxt.demo02; 
import java.time.LocalDate; 
import java.time.temporal.ChronoUnit; 
public class Demo09 { 
  public static void main(String[] args) { 
    LocalDate today = LocalDate.now(); 
    LocalDate previousYear = today.minus(1, ChronoUnit.YEARS); 
    System.out.println("一年前的日期 : " + previousYear); 
    LocalDate nextYear = today.plus(1, ChronoUnit.YEARS); 
    System.out.println("一年后的日期:"+nextYear); 
  } 
} 

示例10:Java 8的Clock时钟类

Java 8增加了一个Clock时钟类用于获取当时的时间戳,或当前时区下的日期时间信息。以前用到System.currentTimeInMillis()和TimeZone.getDefault()的地方都可用Clock替换。

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

示例11:如何用Java判断日期是早于还是晚于另一个日期

另一个工作中常见的操作就是如何判断给定的一个日期是大于某天还是小于某天?在Java 8中,LocalDate类有两类方法isBefore()和isAfter()用于比较日期。调用isBefore()方法时,如果给定日期小于当前日期则返回true。

package com.shxt.demo02; 
import java.time.LocalDate; 
import java.time.temporal.ChronoUnit; 
public class Demo11 { 
  public static void main(String[] args) { 
    LocalDate today = LocalDate.now(); 
    LocalDate tomorrow = LocalDate.of(2018,2,6); 
    if(tomorrow.isAfter(today)){ 
      System.out.println("之后的日期:"+tomorrow); 
    } 
    LocalDate yesterday = today.minus(1, ChronoUnit.DAYS); 
    if(yesterday.isBefore(today)){ 
      System.out.println("之前的日期:"+yesterday); 
    } 
  } 
} 

示例12:Java 8中处理时区

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

package com.shxt.demo02; 
import java.time.LocalDateTime; 
import java.time.ZoneId; 
import java.time.ZonedDateTime; 
public class Demo12 { 
  public static void main(String[] args) { 
    // 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); 
  } 
} 

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

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

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

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

package com.shxt.demo02; 
import java.time.LocalDate; 
public class Demo14 { 
  public static void main(String[] args) { 
    LocalDate today = LocalDate.now(); 
    if(today.isLeapYear()){ 
      System.out.println("This year is Leap year"); 
    }else { 
      System.out.println("2018 is not a Leap year"); 
    } 
  } 
} 

示例15:计算两个日期之间的天数和月数

有一个常见日期操作是计算两个日期之间的天数、周数或月数。在Java 8中可以用java.time.Period类来做计算。

下面这个例子中,我们计算了当天和将来某一天之间的月数。

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

示例16:在Java 8中获取当前的时间戳

Instant类有一个静态工厂方法now()会返回当前的时间戳,如下所示:

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

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

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

package com.shxt.demo02; 
import java.time.LocalDate; 
import java.time.format.DateTimeFormatter; 
public class Demo17 { 
  public static void main(String[] args) { 
    String dayAfterTommorrow = "20180205"; 
    LocalDate formatted = LocalDate.parse(dayAfterTommorrow, 
        DateTimeFormatter.BASIC_ISO_DATE); 
    System.out.println(dayAfterTommorrow+" 格式化后的日期为: "+formatted); 
  } 
} 

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

package com.shxt.demo02; 
import java.time.LocalDate; 
import java.time.LocalDateTime; 
import java.time.format.DateTimeFormatter; 
public class Demo18 { 
  public static void main(String[] args) { 
    LocalDateTime date = LocalDateTime.now(); 
    DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); 
    //日期转字符串 
    String str = date.format(format1); 
    System.out.println("日期转换为字符串:"+str); 
    DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); 
    //字符串转日期 
    LocalDate date2 = LocalDate.parse(str,format2); 
    System.out.println("日期类型:"+date2); 
  } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Python初学者入门指南:从基础到实践的全面学习路径本文为Python初学者提供了一条从基础到实践的全面学习路径。特别介绍了Python字典(Dictionary)中的`items()`方法,该方法用于返回字典中所有键值对的视图对象,便于在循环和其他操作中使用。通过实例讲解,帮助读者更好地理解和应用这一重要功能。 ... [详细]
  • 在上篇文章的基础上,本文将继续探讨 Linux 设备驱动中的设备模型与 `devicedriverbus` 机制。在将设备注册到总线之前,需要先创建 `device` 对象。可以通过静态定义 `device` 结构体变量,并调用 `device_register` 函数来完成这一过程。此外,文章还将详细解析设备模型的内部工作机制,以及 `devicedriverbus` 机制如何实现设备与驱动的自动匹配和管理。 ... [详细]
  • Joda-Time 学习笔记
    一Jode-Time介绍任何企业应用程序都需要处理时间问题。应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径。使用JDK完成这项任务将非常痛苦和繁琐。既 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 深入解析:使用C++实现Python字节数组(struct)的高效处理方法 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 深入解析 Spring MVC 的核心原理与应用实践
    本文将详细探讨Spring MVC的核心原理及其实际应用,首先从配置web.xml文件入手,解析其在初始化过程中的关键作用,接着深入分析请求处理流程,包括控制器、视图解析器等组件的工作机制,并结合具体案例,展示如何高效利用Spring MVC进行开发,为读者提供全面的技术指导。 ... [详细]
  • 深入学习 Python 中的 xlrd 模块:掌握 Excel 文件读取技巧
    本文深入探讨了 Python 中的 xlrd 模块,重点介绍了如何高效读取 Excel 文件(包括 xlsx 和 xls 格式)。同时,文章还详细讲解了 xlwt 模块在 Excel 文件写操作中的应用。此外,文中列举了常见单元格数据类型及其处理方法,为读者提供了全面的实践指导。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • Android开发常见问题汇总(含Gradle解决方案)第二篇
    本文继续深入探讨Android开发中常见的问题及其解决方案,特别聚焦于Gradle相关的挑战。通过详细分析和实例演示,帮助开发者高效解决构建过程中的各种难题,提升开发效率和项目稳定性。 ... [详细]
  • CatchThatCowTimeLimit:50002000MS(JavaOthers)MemoryLimit:3276832768K(JavaOt ... [详细]
  • OpenCV 2.4.9 源码解析:级联分类器的错误率与尺寸分析 ... [详细]
  • Java8 日期和时间类的基本使用_java
    这篇文章主要介绍了Java日期和时间类的基本使用,帮助大家更好的理解和学习Java,感 ... [详细]
  • Django多条件筛选查询主模型只存在外键一对多关系模型设计#快捷筛选状态classStatus(models.Model):order_numbermodels.Positive ... [详细]
author-avatar
周扒pi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有