Оказывается, код был почти верным, но я не учел, что при синтаксическом анализе String
для получения объекта Date
изначально используется система по умолчанию TimeZone
, поэтому исходная дата была не в UTC, как я ожидал.
Хитрость заключалась в том, чтобы установить часовой пояс при разборе даты на UTC, а затем установить его в пункт назначения TimeZone
. Примерно так:
SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sourceFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date parsed = sourceFormat.parse("2011-03-01 15:10:37"); // => Date is in UTC now
TimeZone tz = TimeZone.getTimeZone("America/Chicago");
SimpleDateFormat destFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
destFormat.setTimeZone(tz);
String result = destFormat.format(parsed);