Java 日期和时间是 Java 编程中的一个重要概念,它可以帮助我们更好地处理时间和日期。Java 提供了一系列的 API,可以用来处理时间和日期,这些 API 可以帮助我们轻松地处理各种时间和日期相关的操作。
Java 中的时间和日期 API 分为两大类:java.util.Date 和 java.time。java.util.Date 是 Java 的老版本 API,它提供了一些基本的方法来处理时间和日期。但是它存在一些不足之处,比如不能正确处理不同的时区、不能正确处理年份、不能正确处理小数部分等。
而 java.time 是 Java 8 中引入的新版 API,它提供了一套新的、高效的方法来处理时间和日期。它可以正确地处理不同的时区、年份、小数部分等信息,并支持国际化标准 ISO-8601。
// 获取当前 Date 对象 Date date = new Date(); System.out.println(date); // 获取当前 LocalDateTime 对象 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDateTime);
由 DateTimeFormatter
处理的解析是从字符串创建日期时间对象。
用于格式化的相同符号用作解析字符串值。
如果无法解析文本,则会抛出 DateTimeParseException
。它有两种方法来提供错误的详细信息。 getErrorIndex()
返回文本中的错误偏移量。 getParsedString()
返回正在解析的文本。
日期时间相关的类和DateTimeFormatter定义了将字符串解析为datetime对象的方法。
每个datetime类有两个重载版本的 parse()
。 parse()
方法的返回类型与定义datetime类相同。
下面的代码显示了如何使用 parse()
方法从 LocalDate
对象:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) { LocalDate ld1 = LocalDate.parse("2014-06-10"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy"); LocalDate ld2 = LocalDate.parse("06/10/2014", formatter); System.out.println("ld1: " + ld1); System.out.println("ld2: " + ld2); } }
上面的代码生成以下结果。
DateTimeFormatter
包含几个将字符串解析为datetime对象的parse()方法。
它们中的大多数返回一个TemporalAccessor对象,您可以查询它以获取datetime组件。
您可以将TemporalAccessor对象传递给datetime类的from()方法,以获取特定的datetime对象。
以下代码显示如何使用DateTimeFormatter对象解析MM/dd /yyyy格式的字符串,以构造LocalDate:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; public class Main { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy"); TemporalAccessor ta = formatter.parse("06/10/2014"); LocalDate ld = LocalDate.from(ta); System.out.println(ld); } }
上面的代码生成以下结果。
parse()方法可以通过TemporalQuery将字符串直接解析为特定的datetime对象。
import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy"); LocalDate ld = formatter.parse("06/10/2014", LocalDate::from); System.out.println(ld); } }
上面的代码生成以下结果。
DateTimeFormatter类包含一个parseBest()方法。
parseBest()方法尝试匹配与提供的格式的字符串可选格式符号。
在以下模式中,我们有两个可选模式。
yyyy-MM-dd["T"HH:mm:ss[Z]]
文本可以完全解析为OffsetDateTime,并部分解析为LocalDateTime和LocalDate。
以下代码显示如何使用可选模式从字符串获取最佳匹配日期时间对象。
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.temporal.TemporalAccessor; public class Main { public static void main(String[] args) { DateTimeFormatter parser = DateTimeFormatter .ofPattern("yyyy-MM- dd["T"HH:mm:ss[Z]]"); parseStr(parser, "2014-06-31"); parseStr(parser, "2014-06-31T15:31:12"); parseStr(parser, "2014-06-31T15:31:12-0500"); parseStr(parser, "2014-06-31Hello"); } public static void parseStr(DateTimeFormatter formatter, String text) { try { TemporalAccessor ta = formatter.parseBest(text, OffsetDateTime::from, LocalDateTime::from, LocalDate::from); if (ta instanceof OffsetDateTime) { OffsetDateTime odt = OffsetDateTime.from(ta); System.out.println("OffsetDateTime: " + odt); } else if (ta instanceof LocalDateTime) { LocalDateTime ldt = LocalDateTime.from(ta); System.out.println("LocalDateTime: " + ldt); } else if (ta instanceof LocalDate) { LocalDate ld = LocalDate.from(ta); System.out.println("LocalDate: " + ld); } else { System.out.println("Parsing returned: " + ta); } } catch (DateTimeParseException e) { System.out.println(e.getMessage()); } } }
上面的代码生成以下结果。
Java流 -Java流操作外部迭代当使用Java集合时,我们使用外部迭代。在外部迭代中,我们为每个循环使用for或,或者为序列中的集合...
Java流- Java字符串流Char序列流CharSequence接口的chars()返回一个IntStream,它的元素是表示字符的int值。我们可以在String,S...
Java流 -Java流映射映射操作对每个元素应用函数以产生另一流。输入和输出流中的元素数量是相同的。该操作不修改输入流的元素。您...
Java流 -Java流收集映射我们可以从流中收集数据到映射。在三个版本中重载的toMap()方法Collectors类返回一个收集器以在Map中收集...