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

如何使用java.util.Date解析夏令时切换期间发生的其他时区的日期,java,date,datetime,dst,Java,Date,Datetime,Dst,我在分析以下日期时遇到问题 08 März 2015 02:15:20 代码 经过一些调查,我发现由于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 我怎样才能做到这一点呢

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

08 März 2015 02:15:20
代码

经过一些调查,我发现由于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.*
,考虑到这一点,IIRC,两者都比
java.util.*
干净得多

但是,如果您必须使用
日期
,并且不知道起始时区,最安全的方法是使用
时区

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);

谢谢希望我们的系统最初设计为在接受国际日期之前考虑时区。这将有点棘手。。。
SimpleDateFormat formatter = new SimpleDateFormat(
   "EEE d, yyyy at h:mm:ss tt",
   Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String text = formatter.format(date);