您的代码有两个问题:
- 您已使用
Y
(指定Week year)而不是y
(指定Year)。查看文档以了解有关符号的更多信息。在此处了解更多信息。
- 您的日期时间字符串是英文的,因此如果您在具有 non-English 的 JVM 上运行它,您的代码将无法以预期的方式工作
Locale
。日期时间解析/格式化类型是Locale
敏感的。在此处了解更多信息。
java.time
旧的日期时间 API(java.util
日期时间类型及其格式化 API SimpleDateFormat
)已过时且容易出错。建议完全停止使用它并切换到java.time
现代日期时间 API *。
使用现代 API 的解决方案:
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE, MMMM d, u h:m:s a z", Locale.ENGLISH);
ZonedDateTime zdt = ZonedDateTime.parse("Thursday, July 27, 2006 10:10:02 PM PST", dtf);
System.out.println(zdt);
}
}
输出:
2006-07-27T22:10:02-07:00[America/Los_Angeles]
如果您需要将此对象转换ZonedDateTime
为 的对象java.util.Date
,您可以执行以下操作:
java.util.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 {
SimpleDateFormat sdf = new SimpleDateFormat("EEEE, MMMM d, y h:m:s a z", Locale.ENGLISH);
Date date = sdf.parse("Thursday, July 27, 2006 10:10:02 PM PST");
//...
}
}
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。