在Java中将字符串转换为日期

时间:2020-01-09 10:35:25  来源:igfitidea点击:

在本文中,我们将介绍如何在Java中将String转换为Date。

在Java 8之前,SimpleDateFormat是Java中用于将String转换为Date的选项。从Java 8开始,我们可以使用java.time包中的类,这些类是新的日期和时间API的一部分。我们将看到使用这两个类的方法的示例。

使用SimpleDateFormat将字符串转换为日期

我们可以使用Java SimpleDateFormat类的parse()方法来解析字符串中的文本以生成Date。

第一件事是创建一个传递日期和时间模式进行解析的SimpleDateFormat实例。然后调用parse()方法并传递日期字符串,该方法返回已解析的Date。如果无法解析请求的结果,则抛出ParseException。

在示例中,不同类型的日期字符串被转换为java.util.Date实例。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ParseDate {
  public static void main(String[] args) {
    try {
      parseDT("dd/MM/yyyy", "09/08/2019");
      
      parseDT("MM-dd-yyyy", "09-08-2019");
      // Date will default to epoch (January 1, 1970)
      parseDT("HH:mm:ss", "20:04:19");
      
      parseDT("MM-dd-yyyy HH:mm:ss", "09-08-2019 20:04:19");
    }catch (ParseException e) {
      System.out.println("Error while parsing- " + e.getMessage());
    }

  }
	
  private static void parseDT(String pattern, String dateTime) throws ParseException{
    // Create date format as per specified pattern
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    // parsing
    Date dt = sdf.parse(dateTime);
    System.out.println("After parsing- " + dt);
  }
}

输出量

After parsing- Fri Aug 09 00:00:00 IST 2019
After parsing- Sun Sep 08 00:00:00 IST 2019
After parsing- Thu Jan 01 20:04:19 IST 1970
After parsing- Sun Sep 08 20:04:19 IST 2019

使用新的日期和时间API将字符串转换为日期

从Java 8开始,我们可以使用LocalDate(代表日期),LocalTime(代表时间)和LocalDateTime(代表日期和时间)的parse()方法将String转换为Date。

解析方法有两种变体-

  • parse(CharSequence text)–这里的text参数代表必须解析的日期字符串。字符串必须代表有效的日期,时间或者日期时间

  • parse(CharSequence文本,DateTimeFormatter格式化程序)–我们可以传递一个DateTimeFormatter实例,该实例表示要用于解析的格式化程序。

将字符串转换为LocalDate

LocalDate dt = LocalDate.parse("2019-08-03");// Date in ISO-8601 format

将字符串转换为LocalTime

LocalTime dt = LocalTime.parse("10:15:30");// Time in ISO-8601 format

将字符串转换为LocalDateTime

LocalDateTime dt = LocalDateTime.parse("2007-12-03T10:15:30");// Date-Time in ISO-8601 format

将字符串转换为ZonedDateTime

如果有时区信息,请使用ZonedDateTime。

// Date-Time with time zone in ISO-8601 format
ZonedDateTime dt = ZonedDateTime.parse("2019-07-03T10:15:30+01:00[Europe/Paris]");

使用自定义格式器将字符串转换为日期

在DateTimeFormatter类中,有一个静态的Pattern()方法,我们可以使用该方法指定日期时间格式的模式。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Date;

public class ParseDate {

  public static void main(String[] args) {
    try{
      LocalDate localDate = LocalDate.parse("30/06/2019", DateTimeFormatter.ofPattern("dd/MM/yyyy"));
      System.out.println("Date " + localDate);
         
      localDate = LocalDate.parse("Thu, Sep 19, '19", DateTimeFormatter.ofPattern("EEE, MMM d, ''yy"));
      System.out.println("Date " + localDate);
      
      LocalTime localTime = LocalTime.parse("20:17:46", DateTimeFormatter.ofPattern("HH:mm:ss"));
      System.out.println("Time " + localTime);
      //DateTime
      LocalDateTime localDateTime = LocalDateTime.parse("2019-08-12T20:17:46.384Z", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSz"));
      System.out.println("Date-Time " + localDateTime);
      
      // DateTime with zone offset
      ZonedDateTime zonedDateTime = ZonedDateTime.parse("2019-08-18 AD at 10:13:46 PDT", DateTimeFormatter.ofPattern("yyyy-MM-dd G 'at' HH:mm:ss z"));
      System.out.println("Date " + zonedDateTime);
      
      // DateTime with zone offset   
      zonedDateTime = ZonedDateTime.parse("2019-08-15 03:32:12-0430", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssxx"));
      System.out.println("Date " + zonedDateTime);
      
    }catch(DateTimeParseException ex){
      ex.printStackTrace();
    }		
  }
}

输出量

Date 2019-06-30
Date 2019-09-19
Time 20:17:46
Date-Time 2019-08-12T20:17:46.384
Date 2019-08-18T10:13:46-07:00[America/Los_Angeles]
Date 2019-08-15T03:32:12-04:30