问题描述
最近因为要在工程中用到日期相关的东西,需要将一些表示日期的字符串转换成日期类型并计算该日期的前一天。粗看起来这个问题还是比较简单的,主要就是对于方法api的使用。主要的变换过程就是String--->日期类型---->运算---->String。这么一个过程。
于是,在经过一番搜索之后,得到了一段如下的代码:
String yesterday(String checkOut) throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd"); Date date = formatter.parse(checkOut); int dayInMills = 1000 * 60 * 60 * 24; return formatter.format(date.getTime() - dayInMills); }
在上述代码里,因为我们要输入如2015-12-23等这种格式的字符串,于是首先通过SimpleDateFormat将它解析成Date类型,然后再用这个Date对象减去一个整天的毫秒数。这样就可以得到我们想要的日期了。
如果我们输入的数据为"2015-12-23",这个时候得到的结果是"2015-12-22"。嗯,这样结果看起来没有问题。实际上这种转换还是有问题的,比如说如果我们输入"2015-02-01",那么将出现什么结果呢?结果程序运行的结果是"2014-02-31"!
可见,这种想当然的去用时间减毫秒数的办法并不可行,而且隐藏的问题不容易发觉。那么有没有什么简单易用的办法来解决呢?
Java8 time
Java里面对日期的支持一直不理想,而且以前的Date类型还是mutable的,这意味着该类型还不是线程安全的。在java 8里引入的新的包对它有一个明显的改进。比如说对于上述的问题,在java 8里需要怎么做呢?
public String yesterday(String checkOut) { LocalDate date = LocalDate.parse(checkOut); return date.minusDays(1).format(DateTimeFormatter.ISO_LOCAL_DATE); }
针对我们前面的问题,这里只需要两行代码就解决了。这里引入了新的类型LocalDate, DateTimeFormatter等。那么上面这两行代码表示什么意思呢?首先,前面的LocalDate.parse()方法将输入的字符串转换成LocalDate类型。由于LocalDate对象的默认显示格式就是"yyyy-mm-dd"这种样式的,所以对于本文中的问题就可以直接转换过来。
后续的LocalDate有一个minusDays方法,用它减去1则得到前一天的日期。然后再调用它的format方法得到新的日期的String类型。由于它默认的格式是我们期望的类型,我们返回它的toString()方法也会得到同样的结果。
如果从解决前面这个问题的角度来说,可以说到这里就结束了。既然Java 8引入了新的date time类型,顺便也做一个小小的总结吧。
LocalDate
我们可能接触的最多的类型就是LocalDate了,它和前面的Date类型不一样,本身是immutable的,这意味着它是线程安全的。每次我们调用一些方法,比如前面的minusDays()方法,它实际上是返回一个新的对象而不是修改原有对象本身。
创建LocalDate对象:
由于创建LocalDate对象没有构造函数方法,所有创建改对象必须通过工厂方法的方式,一种方法如下:
LocalDate date = LocalDate.of(2016, 2, 1);
当然,还有一种就是我们前面通过parse方法解析字符串的方式,这种方式在后面会详细讨论。
访问年,月,日
int year = date.getYear(); Month month = date.getMonth(); int mon = date.getMonthValue(); int day = date.getDayOfMonth(); day = date.getDayOfYear(); DayOfWeek dow = date.getDayOfWeek();
上述这些是一些比较常用的访问年月日的方法,比如我们需要访问某个月,如果期望是返回数字的话,可以使用date.getMonthValue()方法,而使用getMonth()方法返回的是一个Month类型,当然Month类型也提供有返回对应月份数值的方法。返回具体某一日的方法有getDayOfMonth, getDayOfYear()以及getDayOfWeek。
由于LocalDate的api比较灵活,如果我们相用一个看起来更加统一的方式来访问年、月和日的话,也有如下的办法:
int year = date.get(ChronoField.YEAR); int mon = date.get(ChronoField.MONTH_OF_YEAR); int day = date.get(ChronoField.DAY_OF_MONTH);
其中的ChronoField是一个enum类型,里面列举了各种日期相关的值。
修改年、月、日
和前面获取年月日相关,LocalDate里也有增加或者减少年月日的api,比如:
date.plusDays(10); date.plusMonths(10); date.plusWeeks(10); date.plusYears(10);
也有一种比较通用的写法就是:
date.plus(10, ChronoUnit.DAYS); date.plus(10, ChronoUnit.MONTHS);
相应的,减少日期的api有如下:
date.minusDays(10); date.minusMonths(10); date.minusWeeks(10); date.minusYears(10); date.minus(10, ChronoUnit.YEARS);
字符串解析
在前面的示例里已经看到过一种解析的办法,就是LocalDate.parse()。这种方法默认的输入String类型是"yyyy-mm-dd"样式的。但是对于我们不同的格式需要,比如2015/02/11这种类型的该怎么处理呢?实际上这里还有一个方法就是LocalDate.parse(String, DateTimeFormatter)。由DateTimeFormatter来设定字符串的格式。
所以对于上述格式的解析可以采用如下的方式:
LocalDate.parse("2016/02/01", DateTimeFormatter.ofPattern("yyyy/MM/dd"));实际上,因为国际上有不同表示日期的格式,在DateTimeFormatter里也提供了很多种类型的参数,比如BASIC_ISO_DATE, ISO_LOCAL_DATE, ISO_DATE等。因为这里定义了不同日期类型的格式,所以对于有些字符串的解析可以采用类似如下的方式:
相关推荐
根据给定文件的信息,我们可以总结出以下几个重要的Java时间处理知识点: ### 1. Java日期与时间的基本操作 #### 1.1 创建当前日期与时间 ```java Date date = new Date(); ``` 这段代码创建了一个`Date`对象,它...
Java 中的日期时间处理是非常重要的,以下是 Java 中日期时间整理的知识点总结: 一、获取服务器端当前日期 在 Java 中,可以使用 `java.util.Date` 类来获取服务器端当前日期。可以使用以下代码来获取当前日期: ...
总结来说,`Date`和`Calendar`是Java中处理日期和时间的基础,它们提供了创建、修改和格式化日期的能力。虽然Java 8引入了更好的日期时间API,但了解和掌握这两个类的用法对于维护和理解老代码仍然是必不可少的。
需要注意的是,`Date`类在Java 8之后已经被`java.time`包中的新API所替代,如`LocalDateTime`、`Instant`等,它们提供了更强大、更易用的日期和时间处理功能。但鉴于题目要求,这里主要讨论的是`Date`类的使用。 `...
在工具类方面,`java.time.LocalDateTime.now()`可以获取当前的日期和时间,`java.time.LocalDate.of(year, month, day)`允许你创建指定日期的实例,而`java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME`则...
根据提供的文件信息,我们可以总结出以下关于Java中Date类及其时间格式化的相关知识点: ### Java Date 类概述 在Java中,`java.util.Date`类表示特定的瞬间,精确到毫秒。该类提供了多种构造方法来创建日期实例,...
Java Time API,自Java 8引入,为处理日期、时间和时区提供了强大的工具,显著优于之前的`java.util.Date`和`Calendar`类。本教程将深入探讨如何在Android中利用Java Time API(`java.time`包)来管理日期和时间。 ...
【Java 操作 Date 对象详解】 在 Java 中,处理日期和时间主要依赖于 `java.util.Date` 和 `java.text.DateFormat` 这两个核心类。在本文中,我们将深入探讨如何使用这些类来获取、格式化和操作日期。 1. **获取...
根据提供的文件信息,可以看出这里似乎存在一定的误解,因为这部分内容实际上并不是Java源代码的一部分,而更像是HTML表单的代码片段。然而,为了更好地理解和解答题目...这对于理解和处理Java中的日期问题非常有帮助。
Java 中的 Date、String 和 Timestamp 之间的转换问题 Java 中的日期和时间处理是编程中非常重要的一方面,Date、String 和 Timestamp 是三种常用的日期和时间类型,本文将详细介绍它们之间的转换问题。 一、获取...
### Java Date 学习总结 在Java开发过程中,时间日期处理是常见的需求之一。本文将对`java.util.Date`、`java.util.Calendar`以及`java.text.SimpleDateFormat`等类的使用进行详细总结,帮助读者更好地理解和掌握...
虽然这里的需求可以使用`java.util.Date`类完成,但使用`java.time`包中的类通常会提供更好的可读性和易用性。例如,使用`java.time.LocalDate`可以这样实现: ```java import java.time.LocalDate; import java....
Java提供了多种方式来处理日期和时间,包括内置的`java.util.Date`类,以及从Java 8开始引入的`java.time`包中的新API。在描述中提到的"my97date"可能是指My97 DatePicker,这是一个流行的Java日期选择控件,常用于...
总结来说,`java.util.Date`虽然在Java 8之后被新的日期时间API取代,但在旧项目或需要兼容旧版本Java的情况下,仍然有其应用价值。理解并熟练使用`Date`及其相关类,对于Java开发者来说是必要的技能之一。同时,...
### 常用Java Date方法...通过以上知识点的总结,我们不仅掌握了Java中日期和时间的基本操作,还学会了如何灵活运用`Calendar`和`Date`类的各种方法来解决实际问题。这些技能对于任何Java开发者来说都是宝贵的财富。
Java的java.util.Date类是Java初的时间类之一。该类的大部分方法已不推荐使用,取而代之的是java.util.Calendar类。不过你仍然可以使用java.util.Date类去表示某个时间。下面是一个如何实例化java.util.Date的例子:...
- `java.util.Date`(Java的日期时间类)可以转换为`java.sql.Date`、`java.sql.Time`或`java.sql.Timestamp`,通过`SimpleDateFormat`进行格式化。 - `java.time.*`(Java 8引入的新日期时间API)的类如`...
在Java编程中,正确地测量时间对于性能优化和调试至关重要。`System.currentTimeMillis()`函数是Java提供的一个基础时间测量工具,它返回自1970年1月1日午夜(UTC)以来的毫秒数。然而,这个方法并不提供微秒级别的...
### Java的Date类型转换成MySQL的DateTime类型 在软件开发特别是网络游戏开发中,记录关键时间点(如游戏开始...此外,还可以考虑使用现代 Java 时间 API(如 `java.time` 包)来进行更高效、更简洁的日期时间处理。
对于系统日期和时间的设置,由于安全性和权限问题,Java程序通常不能直接修改操作系统的日期和时间。但在某些特定场景,如测试环境中,可能需要模拟时间。你可以使用`java.time.Clock`接口,通过实现自己的`Clock`...