timezone inconsistency when parsing datetime Strings
I convert two types of Strings to an ISO format using SimpleDateFormat
for parsing and org.apache.commons.lang.time.DateFormatUtils
for formatting (since they provide a ISO formatter out-of-the-box).
M/d/y H:m
and d.M.y H:m
. A typical String to convert may look either like 4/14/2009 11:22
or 4.14.2009 11:22
. I initialize the parsers as follows:
SimpleDateFormat SLASH = new SimpleDateFormat(PATTERN_S, Locale.getDefault());
SimpleDateFormat DOT = new SimpleDateFormat(PATTERN_D, Locale.getDefault());
I get the the formatter:
FastDateFormat isoFormatter = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT
After creating a Date
from the parsed String:
Date date = FORMAT_SLASH.parse(old);
it is formatted for output:
isoFormatter.format(date)
The strange thing is : when a String
with slashes was converted, the output looks like 2009-04-14T11:42:00+01:00
(which is correct) but when a String
with dots was converted, the output looks like 2010-02-14T11:42:00+02:00
, shifting my timezone to somewhere between Finland and South Africa, the year to 2010 and the month to february
What is going wrong here and why?
EDIT : changed the output strings to match real output (damn you, cut-n-paste). The reason was the interchanged M
and d
in the pattern strings that I failed to notice. 14
seems to be a perfecty valid month - its next year's february and even non-lenien开发者_如何学JAVAt settings can't force the formatter to reject it. The timeshift issue is resolved and the reason for the TimeZone change is provided by Jim Garrison. Thanks Ahmad and Jim
Your dot pattern is d.M.y H:m
while your example shows that you meant M.d.y H:m
, I supposed this would throw a ParseException
, but it doesn't and it causes timezone issues.
精彩评论