Java 分析日期时间字符串时时区不一致

Java 分析日期时间字符串时时区不一致,java,datetime,timezone,Java,Datetime,Timezone,我使用SimpleDataFormat将两种类型的字符串转换为ISO格式进行解析,使用org.apache.commons.lang.time.DateFormatUtils进行格式化(因为它们提供了一个现成的ISO格式化程序)。用于解析的模式字符串是M/d/y H:M和d.M.y H:M。要转换的典型字符串可能类似于4/14/2009 11:22或4.14.2009 11:22。我按如下方式初始化解析器: SimpleDateFormat SLASH = new SimpleDateForma

我使用
SimpleDataFormat
将两种类型的字符串转换为ISO格式进行解析,使用
org.apache.commons.lang.time.DateFormatUtils
进行格式化(因为它们提供了一个现成的ISO格式化程序)。

用于解析的模式字符串是
M/d/y H:M
d.M.y H:M
。要转换的典型字符串可能类似于
4/14/2009 11:22
4.14.2009 11:22
。我按如下方式初始化解析器:

SimpleDateFormat SLASH = new SimpleDateFormat(PATTERN_S, Locale.getDefault());
SimpleDateFormat DOT = new SimpleDateFormat(PATTERN_D, Locale.getDefault()); 
我从格式化程序中获得以下信息:

  FastDateFormat isoFormatter = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT
从解析的字符串创建日期后:

Date date = FORMAT_SLASH.parse(old);
它的格式为输出:

isoFormatter.format(date)
奇怪的是:当带有斜杠的
字符串被转换时,输出看起来像
2009-04-14T11:42:00+01:00
(这是正确的),但是当带有点的
字符串被转换时,输出看起来像
2010-02-14T11:42:00+02:00
,将我的时区转移到芬兰和南非之间的某个地方,截至2010年的一年和截至2月的一个月

这里出了什么问题,为什么


编辑:更改输出字符串以匹配实际输出(该死的,剪切粘贴)。原因是在我没有注意到的模式字符串中互换了
M
d
14似乎是一个完美有效的月份——它是明年的2月,即使不宽松的设置也不能强制格式化程序拒绝它。时间转换问题已解决,时区更改的原因由Jim Garrison提供。感谢Ahmad和Jim,你的点模式是
d.M.y H:M
,而你的例子显示你的意思是
M.d.y H:M
,我想这会引发
解析异常,但它不会,并且会导致时区问题。

你的点字符串真的是
4.14.2009 11:22
?这不适合格式字符串。请重新阅读您的帖子并修复与m/d/y与d.m.y有关的错误(如果有),并确保您向我们显示了正确的输入和输出。我怀疑你有一个问题,一个日期被解释为月和日向后。如果生成的日期(2010/02/04?)位于DST边界的另一侧,则确实可以得到1小时的偏移量。@Paulo Ebermann-确实如此-并进行转换。我认为这是宽松的设置,但模式似乎与严格的设置相匹配setting@Jim加里森-我想你说得对。感谢可以使用DateFormat.setLenient(false)调整异常引发。但是给出互换的月和日值并不能真正产生这里给出的输出。