我有一个名为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格式标准,但总是失败。
建议?
答案 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)
旧的日期时间 API(java.util
日期时间类型及其格式 API,SimpleDateFormat
)已经过时且容易出错。建议完全停止使用它们并切换到 java.time
,modern date-time API*。
另一件需要注意的重要事情是您的字符串包含 English
文本,因此您必须使用 Locale.ENGLISH
以便在您的代码在其 JVM 上运行时不会出现异常或错误结果Locale
不是 English
。无论如何,切勿在没有 Locale
的情况下使用日期时间解析/格式化类型(例如 SimpleDateFormat
、DateTimeFormatter
等),因为这些类型对 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 desugaring 和 How 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());
}
}