您的代码有两个主要问题,现有答案已经解决了其中一个问题。第二个甚至更危险的问题是,不使用Locale
with SimpleDateFormat
,这是一种 -Locale
敏感类型。由于您的日期时间字符串是英文的,请确保使用Locale.ENGLISH
或其他一些英文- Locale
。因此,正确的初始化将是:
SimpleDateFormat sdfSource = new SimpleDateFormat("EEEE, MMMM d, y", Locale.ENGLISH);
选中Never use SimpleDateFormat or DateTimeFormatter without a Locale以了解更多信息。另外,请注意一个单一d
的,用于解析,可以同时满足月份日期的一位数和两位数表示。同样,一个单一的y
可以同时满足两位数和四位数的年份表示。
切换到现代日期时间 API
请注意,java.util
日期时间 API 及其格式化 APISimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到2014 年 3 月随 Java SE 8 发布的现代日期时间 API * 。
使用java.time
现代日期时间 API 的解决方案
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String input = "Friday, February 1, 2013";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE, MMMM d, u", Locale.ENGLISH);
LocalDate date = LocalDate.parse(input, dtf);
System.out.println(date);
}
}
输出:
2013-02-01
ONLINE DEMO
一些注意事项:
- 在这里,您可以使用
y
代替,u
但我更喜欢u
使用y
.
- 为
LocalDate#toString
您提供String
[ISO-8601 格式],这与您所期望的格式完全相同。因此,您无需LocalDate
显式格式化即可获得String
此格式的 a。
从Trail: Date Time了解有关现代日期时间 API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和您的 Android API 工作level 仍然不符合 Java-8,请通过 deugaring和How to use ThreeTenABP in Android Project检查 Java 8+ APIs 。