Java String to Date,ParseException

时间:2011-08-12 20:25:34

标签: java object date simpledateformat

我有一个名为DateCompareOld, it has the value "Fri Aug 12 16:08:41 EDT 2011"的字符串。我想将其转换为日期对象。

 SimpleDateFormat dateType =  new SimpleDateFormat("E M dd H:m:s z yyyy");
 Date convertDate = dateType.parse(DateCompareOld);

但是每次尝试这个时,我都会得到一个解析异常。我尝试过其他SimpleDateFormat格式标准,但总是失败。

建议?

4 个答案:

答案 0 :(得分:5)

请尝试以下格式:

EEE MMM dd HH:mm:ss zzz yyyy

快速测试:

public static void main(String[] args) throws Exception {
    DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    System.out.println(df.parse("Fri Aug 12 16:08:41 EDT 2011"));
}

// outputs
Fri Aug 12 15:08:41 CDT 2011

输出是CDT,因为我就是这样,但价值是正确的。

答案 1 :(得分:2)

DateFormat dateType =  new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
dateType.setLenient(false);
Date convertDate = dateType.parse(DateCompareOld);

答案 2 :(得分:1)

java.time

旧的日期时间 API(java.util 日期时间类型及其格式 API,SimpleDateFormat)已经过时且容易出错。建议完全停止使用它们并切换到 java.timemodern date-time API*

另一件需要注意的重要事情是您的字符串包含 English 文本,因此您必须使用 Locale.ENGLISH 以便在您的代码在其 JVM 上运行时不会出现异常或错误结果Locale 不是 English。无论如何,切勿在没有 Locale 的情况下使用日期时间解析/格式化类型(例如 SimpleDateFormatDateTimeFormatter 等),因为这些类型对 Locale 敏感。

使用现代日期时间 API 的演示:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        String strDateTime = "Fri Aug 12 16:08:41 EDT 2011";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E MMM d H:m:s z u", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
        System.out.println(zdt);
    }
}

输出:

2011-08-12T16:08:41-04:00[America/New_York]

如果您需要一个 java.util.Date 对象,您可以按如下方式获取它:

Date date = Date.from(zdt.toInstant());

Trail: Date Time 了解有关现代日期时间 API 的更多信息。

使用旧 API:

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

public class Main {
    public static void main(String args[]) throws ParseException {
        String strDateTime = "Fri Aug 12 16:08:41 EDT 2011";
        SimpleDateFormat sdf = new SimpleDateFormat("E MMM d H:m:s z y", Locale.ENGLISH);
        Date date = sdf.parse(strDateTime);
        // ...
    }
}

请注意,java.util.Date 对象不是像 modern date-time types 那样的真实日期时间对象;相反,它表示自称为“纪元”的标准基准时间以来的毫秒数,即 January 1, 1970, 00:00:00 GMT(或 UTC)。当您打印 java.util.Date 的对象时,它的 toString 方法返回 JVM 时区中的日期时间,从这个毫秒值计算出来。如果您需要在不同的时区打印日期时间,则需要将时区设置为 SimpleDateFormat 并从中获取格式化的字符串。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

答案 3 :(得分:0)

请注意,传递给SimpleDateFormat()的字符串应更正为“EEE MMM dd HH:mm:ss z yyyy”

以下是代码:

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;
public class DateTest{
public static void main(String []args){
    String DateCompareOld = "Fri Aug 12 16:08:41 EDT 2011";
    SimpleDateFormat dateType =  new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
    Date convertDate = new Date();
    try{
     convertDate = dateType.parse(DateCompareOld);
    }catch(ParseException pex){
        pex.printStackTrace();
    }
    System.out.println(convertDate.toString());
  }

}
相关问题