如何在JDK1.8中愉快地处理日期和时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在JDK1.8中愉快地处理日期和时间相关的知识,希望对你有一定的参考价值。

java.util.Calendar
Calendar 类是一个抽象类,它为特定瞬间与一组诸如
YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protected。
与其他语言环境敏感类一样,Calendar 提供了一个类方法
getInstance,以获得此类型的一个通用的对象。Calendar 的
getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance();

Calendar 对象能够生成为特定语言和日历风格实现日期-时间格式化所需的所有日历字段值,例如,日语-格里高里历,日语-传统日历。Calendar 定义了某些日历字段返回值的范围,以及这些值的含义。例如,对于所有日历,日历系统第一个月的值是 MONTH ==
JANUARY。其他值是由具体子类(例如 ERA)定义的。有关此内容的细节,请参阅每个字段的文档和子类文档。
另外一个是 java.util.Date

类 Date 表示特定的瞬间,精确到毫秒。
在 JDK 1.1 之前,类 Date 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化。从 JDK 1.1
开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃。
尽管 Date 类打算反映协调世界时 (UTC),但无法做到如此准确,这取决于 Java
虚拟机的主机环境。当前几乎所有操作系统都假定 1 天 = 24 × 60 × 60 = 86400 秒。但对于
UTC,大约每一两年出现一次额外的一秒,称为“闰秒”。闰秒始终作为当天的最后一秒增加,并且始终在 12 月 31 日或 6 月 30 日增加。例如,1995
年的最后一分钟是 61 秒,因为增加了闰秒。大多数计算机时钟不是特别的准确,因此不能反映闰秒的差别。
参考技术A public static int countDaysInMonth(Month month)
// 获取当前时间
LocalDate now = LocalDate.now();
System.out.println(now);

// 把当前时间的月份修改为输入的月份
LocalDate thisMonthDate = now.withMonth(month.getValue());
System.out.println(thisMonthDate);
//获取该月的天数
return thisMonthDate.lengthOfMonth();

//获取两个日期相隔的天数
public static void main(String[] args)

LocalDate startDate = LocalDate.of(1993, Month.OCTOBER, 19);
System.out.println("开始时间 : " + startDate);

LocalDate endDate = LocalDate.of(2017, Month.JUNE, 16);

System.out.println("结束时间 : " + endDate);

long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
System.out.println("两天之间的差在天数 : " + daysDiff);

愉快且方便的处理时间-- LocalDate

java中做时间处理时一般会采用java.util.Date,但是相比于Date来说,还有更好的选择 -- java.time.LocalDate

这是jdk8中新增的日期处理类,同时新增的还有java.time.LocalTime、java.time.LocalDateTime。大多吐槽Date的是其对于月份的处理是从0开始的,取得正确月份还得往后偏移一位。Date内容很丰富,不但包含年月日,还包含时间。

相比Date来说,LoalDate更安全、更精确也更明确。LocalDate不包含时间,只是单纯的年月日,要精确到时分秒甚至毫秒的就需要用java.time.LocalDateTime

 

【LocalDate】

一般用法如下:

 

// 取当前日期:
LocalDate today = LocalDate.now(); // -> 2014-12-24
// 根据年月日取日期:
LocalDate crischristmas = LocalDate.of(2014, 12, 25); // -> 2014-12-25
// 根据字符串取:
LocalDate endOfFeb = LocalDate.parse("2014-02-28"); // 严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式
LocalDate.parse("2014-02-29"); // 无效日期无法通过:DateTimeParseException: Invalid date

 

一般日期转换:

// 取本月第1天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2017-03-01
// 取本月第2天:
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2017-03-02
// 取本月最后一天,再也不用计算是28,29,30还是31:
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2017-12-31
// 取下一天:
LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 变成了2018-01-01
// 取2017年1月第一个周一,用Calendar要死掉很多脑细胞:
LocalDate firstMondayOf2015 = LocalDate.parse("2017-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2017-01-02

【LocalTime】

LocalTime只包含时间,获得当前时间:

LocalTime now = LocalTime.now(); // 23:11:08.006

构造时间:

LocalTime zero = LocalTime.of(0, 0, 0); // 00:00:00
LocalTime mid = LocalTime.parse("12:00:00"); // 12:00:00

JDBC

最新JDBC映射将把数据库的日期类型和Java 8的新类型关联起来:

SQL -> Java
--------------------------
date -> LocalDate
time -> LocalTime
timestamp -> LocalDateTime

 

 

参考:http://www.liaoxuefeng.com/article/00141939241051502ada88137694b62bfe844cd79e12c32000

以上是关于如何在JDK1.8中愉快地处理日期和时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java 8中愉快地处理日期和时间

如何在java8中愉快地处理日期和时间java8新增了localdate和localtim

JAVA8 日期时间API整理

OLAP 多维数据集中的日期维度已停止处理

LocalDateTime JDK1.8

在 Swift 中,如何在继续编写代码之前安全地确保从 Google 检索数据(日期和时间)?