Java日期时间 - Java日期和时间解析
由DateTimeFormatter处理的解析是从字符串创建日期时间对象。
用于格式化的相同符号用作解析字符串值。
如果无法解析文本,则会抛出DateTimeParseException。它有两种方法来提供错误的详细信息。getErrorIndex()返回文本中的错误偏移量。getParsedString()返回正在解析的文本。
日期时间相关的类和DateTimeFormatter定义了将字符串解析为datetime对象的方法。
parse()方法从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);
}
}
上面的代码生成以下结果。
parse()从DateTimeFormatter类
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);
}
}
上面的代码生成以下结果。
Parse Best
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());
}
}
}
上面的代码生成以下结果。