2016-01-04 2 views
1

Я пробовал следующий код, который должен позволить мне преобразовать временной проход в качестве параметра в строку с еще одним часом (GMT + 1).
Но я всегда получаю то же время у меня есть в моем объекте TimeJava-преобразовать объект Time (GMT) в String (GMT + 1)

public static String getFormattedTimeLabel(final Time time) { 
    Calendar cal = new GregorianCalendar(); 
    cal.setTimeInMillis(time.getTime()); 
    SimpleDateFormat sdf = new SimpleDateFormat("HH : mm"); 
    sdf.setCalendar(cal); 
    sdf.setTimeZone(TimeZone.getDefault()); 
    return sdf.format(cal.getTime()); 
}  

Кто-нибудь знает, как решить эту проблему?

EDIT: Хорошо, поэтому я создал следующую функцию в контроллере.
Часовой пояс, который я установил в формате простой даты, является часовым поясом клиента, который восстанавливается благодаря HttpServletRequest.
После кода вы можете распечатать результат System.out.

private Time getTimeLocal(Time requestTime) { 
    Calendar cal = new GregorianCalendar(); 
    cal.setTimeInMillis(requestTime.getTime()); 
    SimpleDateFormat sdf = new SimpleDateFormat("HH : mm"); 
    sdf.setCalendar(cal); 
    System.out.println(requestTime); 
    sdf.setTimeZone(tz); 
    System.out.println(tz.getID()); 
    String dt = sdf.format(cal.getTime()); 
    Date date = null; 
    try { 
     date = sdf.parse(dt); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    System.out.println(dt); 
    return new Time(date.getTime()); 
} 

10:00:00 //the Time object 
Europe/Paris // The id of the client timezone (GMT+1 for me) 
10 : 00 //the date. the time printed is not correct it should be set with the timezone of the client so for me GMT+1 so 11:00:00 
+0

@BoristheSpider TimeZone.getDefault() должен быть Timezone системы. и я не использую тот, который мне нужен, потому что он может меняться в зависимости от страны, в которой используется приложение. –

+0

Посмотрите на эту тему http://stackoverflow.com/questions/3581258/adding-n-hours- to-a-date-in-java –

+1

@ Spidi'sWeb: вопрос заключается не в добавлении часов, а в настройке часового пояса и форматировании. –

ответ

3

Код, кажется, работает правильно. Когда вы выводите результат, время отображается как время в правильном часовом поясе. Попытка добавить параметр часового пояса следующим образом:

public static String getFormattedTimeLabel(final Time time, String tzId) { 
    Calendar cal = new GregorianCalendar(); 
    cal.setTimeInMillis(time.getTime()); 
    SimpleDateFormat sdf = new SimpleDateFormat("HH : mm"); 
    sdf.setCalendar(cal); 
    sdf.setTimeZone(tzId == null ? TimeZone.getDefault() : TimeZone.getTimeZone(tzId)); 
    return sdf.format(cal.getTime()); 
} 

и запустив его:

Time time = new Time(System.currentTimeMillis()); 
System.out.println(getFormattedTimeLabel(time, null)); 
System.out.println(getFormattedTimeLabel(time, "UTC")); 

дает следующие результаты (как сейчас):

12 : 08 
11 : 08 

Как я в т.з. GMT + 1, и сейчас коротко в полдень, результаты верны.

BTW, печать объект времени, как это:

System.out.println(time.toString()); 

дает:

12:08:16 

т.е. он отформатирован по умолчанию в часовом поясе по умолчанию.

BTW снова, функция может быть упрощена, чтобы не использовать объект Calendar следующим образом:

public static String getFormattedTimeLabel(final Time time, String tzId) { 
    SimpleDateFormat sdf = new SimpleDateFormat("HH : mm"); 
    sdf.setTimeZone(tzId == null ? TimeZone.getDefault() : TimeZone.getTimeZone(tzId)); 
    return sdf.format(time); 
} 

Установка часового пояса в SimpleDateFormat достаточно.

0

ok Я наконец нашел решение благодаря этому сообщению Date TimeZone conversion in java?, и помощь всех ребят приняла участие в моем сообщении.

Мой окончательный код:

private Time getTimeLocal(Time requestTime) { 
    String ret = Utils.getFormattedTimeLabel(requestTime); 
    SimpleDateFormat sdfgmt = new SimpleDateFormat("HH : mm"); 
    sdfgmt.setTimeZone(TimeZone.getTimeZone("GMT")); 

    SimpleDateFormat sdfmad = new SimpleDateFormat("HH : mm"); 
    sdfmad.setTimeZone(TimeZone.getTimeZone(tz.getID())); 

    Date inptdate = null; 
    try { 
     inptdate = sdfgmt.parse(ret); 
    } catch (ParseException e) {e.printStackTrace();} 

    String localString = sdfmad.format(inptdate); 
    try { 
     inptdate = sdfmad.parse(localString); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    return new Time(inptdate.getTime()); 
} 
+0

«Время», насколько мне известно, миллисекунды с эпохи в GMT - он не может быть «местным». Этот код немного странный, так как то, что вы делаете, по существу добавляет или вычитает ваше смещение часового пояса от значения, которое должно всегда быть миллисекундами с эпохи GMT ... –

Смежные вопросы