2015-03-16 3 views
-1

http://ideone.com/T5wSRV это ссылка ниже кодSimpleDateFormat не дает время?

SimpleDateFormat dateFormatIST = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss"); 
dateFormatIST.setTimeZone(TimeZone.getTimeZone("IST")); 

//Time in IST 
Date date=dateFormatIST.parse(dateFormatIST.format(new Date())); 
System.out.println(date); 

это не дает точного времени IST, где в качестве кода ниже работает отлично. Зачем? http://ideone.com/9KSaZx Это ссылка на ниже код, который дает желаемый результат. Помогите мне понять поведение.

SimpleDateFormat dateFormatIST = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss"); 
dateFormatIST.setTimeZone(TimeZone.getTimeZone("IST")); 

//Local time zone 
SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss"); 

//Time in IST 
Date date=dateFormatLocal.parse(dateFormatIST.format(new Date())); 
System.out.println(date); 
+0

Просьба представить ожидаемые и фактические результаты в каждом случае. И почему вы форматируете, затем разбираете, а затем форматируете снова (используя Date.toString) в последнем случае? И какой у вас часовой пояс? Ваш вопрос в настоящее время очень неясен. (Также бесполезно иметь переменную, называемую 'dateFormatGmt', которая использует IST ...) –

+0

Это дает мне правильное время. Что вы ожидали в результате, при текущем времени IST? –

+1

кажется, что IST не является «устаревшим» часовым поясом и должен быть заменен, начало ответа здесь: http://stackoverflow.com/questions/11264697/java-timezone-strange-behavior-with-ist – vincent

ответ

3

Поведение логично. Дело в том, что есть no информация о временной зоне - это Date объект. Объект Date содержит Универсальное время. И когда вы format затем parse форматированный строка, вы все еще имеют ту же дату:

Я прокомментировал код с результатами:

SimpleDateFormat dateFormatIST = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss"); 
    dateFormatIST.setTimeZone(TimeZone.getTimeZone("IST")); 

    //Local time zone 
    SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss"); 

    //Time in IST 
    Date d = new Date(); 
    System.out.println(d); 
    // Mon Mar 16 16:57:19 CET 2015 

=> сейчас в моей т.з. (CET)

System.out.println(dateFormatIST.format(d)); 
    // 2015-Mar-16 21:27:19 

=> теперь IST TZ

System.out.println(dateFormatLocal.format(d)); 
    // 2015-Mar-16 16:57:19 

=> Сейчас в моей т.з. (CET)

Date dateIST = dateFormatIST.parse(dateFormatIST.format(d)); 
    System.out.println(dateIST); 
    // Mon Mar 16 16:57:19 CET 2015 

=> Объект dateIST содержит еще "сейчас", а формат по умолчанию локальный, который CET

Date dateLoc = dateFormatLocal.parse(dateFormatLocal.format(d)); 
    System.out.println(dateLoc); 
    // Mon Mar 16 16:57:19 CET 2015 

=> То же самое, что и выше

Date dateLocIST = dateFormatLocal.parse(dateFormatIST.format(d)); 
    System.out.println(dateLocIST); 
    // Mon Mar 16 21:27:19 CET 2015 

=>dateFormatIST.format(d) дает "2015-Mar-16 21:27:19" и dateFormatLocal.parse() будет интерпретировать это как местный (CET для меня) дата. В результате получается "Mon Mar 16 21:27:19 CET 2015".

Если вам нужно перевести даты между различными часовыми поясами, вам обязательно нужно пойти на класс Calendar.

+0

Спасибо за ответ. Но вы можете продумать последние две строки, особенно последнюю интерпретирующую часть «dateFormatIST.format (d) дает« 2015-март-16 21:27:19 », а dateFormatLocal.parse() будет интерпретировать ее как местная (CET для меня) дата. Тогда результат «Mon Mar 16 21:27:19 CET 2015» « –

+0

Как я уже сказал,' dateFormatLocal.parse («2015-март-16 21:27:19») 'даст объект« Date », который соответствует« String »2015-Mar-16 21:27:19» в местное время CET. Тогда очевидно, что когда вы просто печатаете его по умолчанию, в котором CET (для меня), вы получаете ту же дату/время, но с другим форматом. –

+0

Если вы используете Java 8, ознакомьтесь с новым API-интерфейсом даты и времени в пакете 'java.time', который намного лучше, чем старый' java.util.Date' и 'java.util.Calendar классов. – Jesper