我在解析以下日期时遇到问题。
08 März 2015 02:15:20
代码
SimpleDateFormat fmt = new SimpleDateFormat("dd MMM yyyy HH:mm:ss", Locale.GERMAN);
fmt.setLenient(false);
try {
System.out.println(fmt.parse("08 März 2015 02:15:20"));
} catch (ParseException e) {
e.printStackTrace();
}
经过一番调查,我发现由于 DST 的工作原理,我所在时区的凌晨 2 点并不存在。一旦时钟敲响凌晨 1:59,下次更新时间将是凌晨 3 点。我已经检查过以下日期是否属于这种情况:
"08 März 2015 01:59:59"
"08 März 2015 03:00:00"
两者都可以正确解析。
我想要的是一个日期对象,它能够正确地解释输入日期,正如我所看到的那样:
Mar 8, 2015 at 2:15:20 AM
我怎样才能做到这一点?
最佳答案
理想情况下,您可以使用一个解析器来解析日期/时间值,而无需尝试应用时区 - java.time.*
和 Joda Time 都可以。考虑到这一点,IIRC,两者都比 java.util.*
干净得多。
但是,如果您必须使用Date
,并且不知道起始时区,最安全的方法是使用TimeZone
>:
SimpleDateFormat parser = new SimpleDateFormat(
"dd MMM yyyy HH:mm:ss",
Locale.GERMAN);
parser.setLenient(false);
parser.setTimeZone(TimeZone.getTimeZone("UTC"));
因此,这会将其解析为原始 UTC 格式 - 因此,当您想要将其格式化回文本时,您需要执行相同的操作:
SimpleDateFormat formatter = new SimpleDateFormat(
"EEE d, yyyy at h:mm:ss tt",
Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String text = formatter.format(date);
关于java - 如何使用 java.util.Date 解析夏令时切换期间发生的其他时区的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29150203/