Преобразование дат UTC в другие часовые пояса
Я конвертирую время UTC в другой часовой пояс, используя этот метод:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parsed = format.parse("2011-03-01 15:10:37");
TimeZone tz = TimeZone.getTimeZone("America/Chicago");
format.setTimeZone(tz);
String result = format.format(parsed);
Итак, вход 2011-03-01 15:10:37
, но выход этого (значение результата) 2011-03-01 05:40:37
. В то время как это кажется выключенным, и согласно эта ссылка, это должно быть 2011-03-01 09:10:37
.
Что я делаю неправильно?
Ответы
Ответ 1
Получается, что код был почти правильным, что я не принимал во внимание, так это то, что при разборе 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);
Ответ 2
Преобразование даты Строка формата "2011-06-23T15: 11: 32" для выхода из часового пояса.
private String getDate(String dateString) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date value = null;
try {
value = formatter.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy hh:mmaa");
dateFormatter.setTimeZone(TimeZone.getDefault());
String dt = dateFormatter.format(value);
return dt;
}
Ответ 3
Вам нужно учитывать летние сбережения. Я делаю это, разрабатывая смещение (от UTC) в миллисекундах. Что-то вроде этого должно работать.
int currentOffsetFromUTC = tz.getRawOffset() + (tz.inDaylightTime(parsed) ? tz.getDSTSavings() : 0);
String result = format.format(parsed.getTime() + currentOffsetFromUTC);
Метод inDayLightTime(...)
возвращает логическое значение и должен быть передан объекту Date, чтобы он мог решить, соответствует ли эта дата "дате" в течение периода летнего времени или нет.
Ответ 4
Вы можете проанализировать формат даты и часовой пояс в соответствии с вашими требованиями.
Попробуйте этот фрагмент кода, я надеюсь, он вам поможет.
private String getFormattedDate(String OurDate) {
try {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); // According to your Server TimeStamp
formatter.setTimeZone(TimeZone.getTimeZone("UTC")); //your Server Time Zone
Date value = formatter.parse(OurDate); // Parse your date
SimpleDateFormat dateFormatter = new SimpleDateFormat("MM-dd-yyyy"); //this format changeable according to your choice
dateFormatter.setTimeZone(TimeZone.getDefault());
OurDate = dateFormatter.format(value);
} catch (Exception e) {
OurDate = "00-00-0000 00:00";
}
return OurDate;
}
Ответ 5
Следующий код отлично подходит для меня, чтобы изменить дату с одного tz на другой. Он также рассматривает DayLightSaving.
public static Calendar changeTimezoneOfDate(Date date, TimeZone fromTZ, TimeZone toTZ) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
long millis = calendar.getTimeInMillis();
long fromOffset = fromTZ.getOffset(millis);
long toOffset = toTZ.getOffset(millis);
long convertedTime = millis - (fromOffset - toOffset);
Calendar c = Calendar.getInstance();
c.setTimeInMillis(convertedTime);
return c;
}