Java8中字符串时间转 Date与LocalDateTime、LocalDate、LocalTime互转

当用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秒

  1. //定义一个任意格式的日期、l讨间字符串
  2. String strl="2019-04-12 O1时06分09秒";
  3. //根据需要解析的日期、时间字符串定义解析所用的格式器
  4. DateTimeFormatter fomatterl=DateTimeFormatter.ofPattern("yyyy-MM-dd HH时mm分ss秒");
  5. //执行解析
  6. LocalDateTime dtl=LocalDateTime.parse(strl,fomatterl);
  7. 会出现问题的yyyy-MM
  8. //定义一个任意格式的日期、l讨间字符串
  9. String strl="2014-04";
  10. //根据需要解析的日期、时间字符串定义解析所用的格式器
  11. DateTimeFormatter fomatterl=DateTimeFormatter.ofPattern("yyyy-MM");
  12. //执行解析
  13. LocalDateTime dtl=LocalDateTime.parse(strl,fomatterl);

那我们怎么把yyyy-MM格式的字符串转成LocalDateTime呢?

我们可以转成Data,然后 Date与LocalDateTime、LocalDate、LocalTime互转

Java 8中 java.util.Date 类新增了两个方法,分别是from(Instant instant)和toInstant()方法

  1. // Obtains an instance of Date from an Instant object.
  2. public static Date from(Instant instant) {
  3. try {
  4. return new Date(instant.toEpochMilli());
  5. } catch (ArithmeticException ex) {
  6. throw new IllegalArgumentException(ex);
  7. }
  8. }
  9. // Converts this Date object to an Instant.
  10. public Instant toInstant() {
  11. return Instant.ofEpochMilli(getTime());
  12. }

这两个方法使我们可以方便的实现将旧的日期类转换为新的日期类,具体思路都是通过Instant当中介,然后通过Instant来创建LocalDateTime(这个类可以很容易获取LocalDate和LocalTime),新的日期类转旧的也是如此,将新的先转成LocalDateTime,然后获取Instant,接着转成Date,具体实现细节如下:
string转成Date

  1. //字符串转换成Date
  2. String str="2019-03-23";
  3. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  4. Date data=sdf.parse(str);

01. java.util.Date 转成 java.time.LocalDateTime

  1. public void UDateToLocalDateTime() {
  2. java.util.Date date = new java.util.Date();
  3. Instant instant = date.toInstant();
  4. ZoneId zone = ZoneId.systemDefault();
  5. LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
  6. }

02. java.util.Date 转成 java.time.LocalDate

  1. public void UDateToLocalDate() {
  2. java.util.Date date = new java.util.Date();
  3. Instant instant = date.toInstant();
  4. ZoneId zone = ZoneId.systemDefault();
  5. LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
  6. LocalDate localDate = localDateTime.toLocalDate();
  7. }

03. java.util.Date 转成 java.time.LocalTime

  1. public void UDateToLocalTime() {
  2. java.util.Date date = new java.util.Date();
  3. Instant instant = date.toInstant();
  4. ZoneId zone = ZoneId.systemDefault();
  5. LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
  6. LocalTime localTime = localDateTime.toLocalTime();
  7. }

04. java.time.LocalDateTime 转成 java.util.Date

  1. public void LocalDateTimeToUdate() {
  2. LocalDateTime localDateTime = LocalDateTime.now();
  3. ZoneId zone = ZoneId.systemDefault();
  4. Instant instant = localDateTime.atZone(zone).toInstant();
  5. java.util.Date date = Date.from(instant);
  6. }

05. java.time.LocalDate 转成 java.util.Date

  1. public void LocalDateToUdate() {
  2. LocalDate localDate = LocalDate.now();
  3. ZoneId zone = ZoneId.systemDefault();
  4. Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
  5. java.util.Date date = Date.from(instant);
  6. }

6. java.time.LocalTime 转成 java.util.Date

  1. public void LocalTimeToUdate() {
  2. LocalTime localTime = LocalTime.now();
  3. LocalDate localDate = LocalDate.now();
  4. LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
  5. ZoneId zone = ZoneId.systemDefault();
  6. Instant instant = localDateTime.atZone(zone).toInstant();
  7. java.util.Date date = Date.from(instant);
  8. }