【发布时间】:2011-02-04 15:16:36
【问题描述】:
我将两种类型的字符串转换为 ISO 格式,使用 SimpleDateFormat 进行解析,使用 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 date = FORMAT_SLASH.parse(old);
格式化输出:
isoFormatter.format(date)
奇怪的是:当带有斜线的String 被转换时,输出看起来像2009-04-14T11:42:00+01:00(这是正确的)但是当带有点的String 被转换时,输出看起来像2010-02-14T11:42:00+02:00,移位我的时区在芬兰和南非之间的某个地方,2010 年到 2 月的一年
这里出了什么问题,为什么?
EDIT :更改输出字符串以匹配实际输出(该死的,剪切-粘贴)。原因是我没有注意到的模式字符串中的M 和d 互换了。 14 似乎是一个完美有效的月份 - 它明年的 2 月甚至非宽松设置都不能强制格式化程序拒绝它。时移问题已解决,时区更改的原因由 Jim Garrison 提供。谢谢艾哈迈德和吉姆
【问题讨论】:
-
你的点串真的是
4.14.2009 11:22吗?这不适合格式字符串。 -
请重新阅读您的帖子并修复与 m/d/y 与 d.m.y 相关的错误(如果有),并确保您向我们展示了正确的输入和输出。我怀疑你有一个日期被解释为月份和日期倒退的问题。如果结果日期(2010/02/04?)在 DST 边界的另一侧,您确实可以获得 1 小时的偏移量。
-
@Paulo Ebermann - 确实如此 - 并且它转换了。我认为这是宽松的设置,但即使设置严格,模式似乎也匹配
-
@Jim Garrison - 我想你是对的。谢谢