我使用 SimpleDateFormat
将两种类型的字符串转换为 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 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 月
这里出了什么问题,为什么?
编辑:更改输出字符串以匹配实际输出(该死的,剪切粘贴)。原因是互换了M
和d
在我没有注意到的模式字符串中。 14
似乎是一个完全有效的月份 - 明年的二月,甚至非宽松的设置也不能强制格式化程序拒绝它。时移问题已解决,时区更改的原因由 Jim Garrison 提供。谢谢艾哈迈德和吉姆
最佳答案
你的点模式是d.M.y H:m
,而你的例子显示你的意思是M.d.y H:m
,我想这会抛出一个ParseException
>,但事实并非如此,并且会导致时区问题。
关于java - 解析日期时间字符串时时区不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899579/