如何使用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);