当用Java8的日期类LocalDateTime和DateTimeFormatter处理String型的日期类型yyyy-MM时出现了问题: java.time.format.DateTimeParseException: Text ‘2019.04.30’could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor,原来LocalDateTime.parse()方法只能转换精确到时间的字符串。LocalDateTime是LocalDate和LocalTime的结合,LocalDate是日期,而LocalTime是时间,所以LocalDateTime只能是日期和时间。
正确的:yyyy-MM-dd HH时mm分ss秒
//定义一个任意格式的日期、l讨间字符串
String strl="2019-04-12 O1时06分09秒";
//根据需要解析的日期、时间字符串定义解析所用的格式器
DateTimeFormatter fomatterl=DateTimeFormatter.ofPattern("yyyy-MM-dd HH时mm分ss秒");
//执行解析
LocalDateTime dtl=LocalDateTime.parse(strl,fomatterl);
会出现问题的yyyy-MM
//定义一个任意格式的日期、l讨间字符串
String strl="2014-04";
//根据需要解析的日期、时间字符串定义解析所用的格式器
DateTimeFormatter fomatterl=DateTimeFormatter.ofPattern("yyyy-MM");
//执行解析
LocalDateTime dtl=LocalDateTime.parse(strl,fomatterl);
那我们怎么把yyyy-MM格式的字符串转成LocalDateTime呢?
我们可以转成Data,然后 Date与LocalDateTime、LocalDate、LocalTime互转
Java 8中 java.util.Date 类新增了两个方法,分别是from(Instant instant)和toInstant()方法
// Obtains an instance of Date from an Instant object.
public static Date from(Instant instant) {
try {
return new Date(instant.toEpochMilli());
} catch (ArithmeticException ex) {
throw new IllegalArgumentException(ex);
}
}
// Converts this Date object to an Instant.
public Instant toInstant() {
return Instant.ofEpochMilli(getTime());
}
这两个方法使我们可以方便的实现将旧的日期类转换为新的日期类,具体思路都是通过Instant当中介,然后通过Instant来创建LocalDateTime(这个类可以很容易获取LocalDate和LocalTime),新的日期类转旧的也是如此,将新的先转成LocalDateTime,然后获取Instant,接着转成Date,具体实现细节如下:
string转成Date
//字符串转换成Date
String str="2019-03-23";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date data=sdf.parse(str);
01. java.util.Date 转成 java.time.LocalDateTime
public void UDateToLocalDateTime() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
}
02. java.util.Date 转成 java.time.LocalDate
public void UDateToLocalDate() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
LocalDate localDate = localDateTime.toLocalDate();
}
03. java.util.Date 转成 java.time.LocalTime
public void UDateToLocalTime() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
LocalTime localTime = localDateTime.toLocalTime();
}
04. java.time.LocalDateTime 转成 java.util.Date
public void LocalDateTimeToUdate() {
LocalDateTime localDateTime = LocalDateTime.now();
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}
05. java.time.LocalDate 转成 java.util.Date
public void LocalDateToUdate() {
LocalDate localDate = LocalDate.now();
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}
6. java.time.LocalTime 转成 java.util.Date
public void LocalTimeToUdate() {
LocalTime localTime = LocalTime.now();
LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}
原创来源:滴一盘技术