java - 如何使用 java.util.Date 解析夏令时切换期间发生的其他时区的日期

标签 java date datetime dst

我在解析以下日期时遇到问题。

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/

相关文章:

java - Guava:copyOf() 方法的 ImmutableList 魔法

php - 将创建日期时间戳添加到 WooCommerce 客户电子邮件

python - Pandas 日期时间格式

r - 将整数列转换为时间HH :MM

sqlite - SQLite DATETIME 函数中的 '-1 month' 是 'broken' 吗?

java - Jira ServiceDesk 用户创建 - 此资源需要 WebSudo

java - 在 Rserve 上仅采购一次 r 文件

java - 处理后重新启动 JFrame

java - 处理后获得的日期不正确

sql - 在没有循环的情况下在 SQL 中添加迄今为止的工作日