2015-03-13 4 views
0

Мне нужно загрузить одну дату, например: «14-03-2015 14:00:00» в переменной java. Но эта дата в GMT +4Время загрузки Java Дата страны и конвертировать в локальное время

И я хотел бы, чтобы преобразовать его к моему местному времени, которое GMT ​​+1

Я видел много конверсий, чтобы получить местное время в одной стране. Например, этот код показывает местную дату в Мельбурне и в Мадриде, но нет, что я ищу.

DateTime dt = new DateTime(org.joda.time.DateTimeZone.forID("Australia/Melbourne")); 
DateTimeZone dtZone = DateTimeZone.forID("Europe/Madrid"); 
DateTime dtus = dt.withZone(dtZone); 

Большое спасибо заранее;)

+0

Итак, что * * вы ищете для? Что вы ожидаете от вывода, и что этот код дает вам вместо этого? – RealSkeptic

+0

Не совсем понятно, что вы * * ищете, так как этот код преобразуется из одного часового пояса в другой. Является ли проблема, что вам нужно * разобрать * в этом часовом поясе? Пожалуйста, будьте более конкретными, иначе вам будет сложно помочь. –

+0

http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html#forOffsetHours-int- –

ответ

0

Вам не нужно использовать Joda время, это очень легко вычислить с основной Java библиотеки. Недостаточно рассчитать разницу во времени, следует учитывать летние и зимние переключатели.

TimeZone # getRawOffset, TimeZone # getDSTSavings, TimeZone # inDaylightTime следует использовать методы Java. Используйте TimeZone # getRawOffset, чтобы получить временное смещение по времени UTC. Уделите особое внимание этому методу, потому что это не возвращает экономию дневных денег. Используйте TimeZone # getDSTSavings, чтобы получить время смещения дневного времени в миллисекундах. Заключительное использование TimeZone # inDaylightTime, чтобы проверить, находится ли время в DST.

Вот полный код;

 TimeZone timeZoneMelbourne = TimeZone.getTimeZone("Australia/Melbourne"); 
     TimeZone timeZoneMadrid = TimeZone.getTimeZone("Europe/Madrid"); 

     System.out.println("timeZoneMelbourne.getRawOffset() -> " + timeZoneMelbourne.getRawOffset()); 
     System.out.println("timeZoneMadrid.getRawOffset() -> " + timeZoneMadrid.getRawOffset()); 
     System.out.println("timeZoneMelbourne.getDSTSavings() -> " + timeZoneMelbourne.getDSTSavings()); 
     System.out.println("timeZoneMadrid.getDSTSavings() -> " + timeZoneMadrid.getDSTSavings()); 

     Calendar c = Calendar.getInstance(); 
     c.set(Calendar.YEAR, 2015); 
     c.set(Calendar.MONTH, 2); 
     c.set(Calendar.DAY_OF_MONTH, 13); 

     c.set(Calendar.HOUR_OF_DAY, 20); 
     c.set(Calendar.MINUTE, 0); 
     c.set(Calendar.SECOND, 0); 


     int timeDiff = timeZoneMadrid.getRawOffset() - timeZoneMelbourne.getRawOffset(); 
     int madridDST = 0; 
     int melbourneDST = 0; 

     if(timeZoneMadrid.inDaylightTime(c.getTime())) 
     { 
      madridDST = timeZoneMadrid.getDSTSavings(); 
      System.out.println("timeZoneMadrid#inDaylightTime -> " + madridDST); 
     } 

     if(timeZoneMelbourne.inDaylightTime(c.getTime())) 
     { 
      melbourneDST += timeZoneMelbourne.getDSTSavings(); 
      System.out.println("timeZoneMelbourne#inDaylightTime -> " + melbourneDST); 
     } 

     timeDiff = timeDiff - melbourneDST + madridDST; 

     System.out.println("total timeDiff -> " +timeDiff); 


     System.out.println("timeZoneMelbourne -> " +c.getTime()); 

     c.add(Calendar.MILLISECOND, timeDiff); 

     System.out.println("timeZoneMadrid -> " +c.getTime()); 

Выходной код;

timeZoneMelbourne.getRawOffset() -> 36000000 

timeZoneMadrid.getRawOffset() -> 3600000 

timeZoneMelbourne.getDSTSavings() -> 3600000 

timeZoneMadrid.getDSTSavings() -> 3600000 

timeZoneMelbourne#inDaylightTime -> 3600000 

timeDiff -> -36000000 

timeZoneMelbourne -> Fri Mar 13 20:00:00 EET 2015 

timeZoneMadrid -> Fri Mar 13 10:00:00 EET 2015 

Проверьте правильность на this. 13 марта разница в 10 часов.

Позволяет проверить код на 13 июня, который является летним временем в Мадриде. Кроме того, есть переход между летним и зимним периодом.

Укажите код этого кода;

timeZoneMelbourne.getRawOffset() -> 36000000 

timeZoneMadrid.getRawOffset() -> 3600000 

timeZoneMelbourne.getDSTSavings() -> 3600000 

timeZoneMadrid.getDSTSavings() -> 3600000 

timeZoneMadrid#inDaylightTime -> 3600000 

total timeDiff -> -28800000 

timeZoneMelbourne -> Sat Jun 13 20:00:00 EEST 2015 

timeZoneMadrid -> Sat Jun 13 12:00:00 EEST 2015 

Вы можете проверить правильность расчета на this

Кроме того, я полностью согласен @ dimo414. Лучше всего использовать время Joda для операций даты и времени.

Код Joda;

Calendar c = Calendar.getInstance(); 
    c.set(Calendar.YEAR, 2015); 
    c.set(Calendar.MONTH, 5); 
    c.set(Calendar.DAY_OF_MONTH, 13); 

    c.set(Calendar.HOUR_OF_DAY, 20); 
    c.set(Calendar.MINUTE, 0); 
    c.set(Calendar.SECOND, 0); 

    LocalDateTime dateTime = new LocalDateTime(c.getTime()); 
    DateTime srcDateTime = dateTime.toDateTime(DateTimeZone.forID("Australia/Melbourne")); 
    DateTime dstDateTime = srcDateTime.withZone(DateTimeZone.forID("Europe/Madrid")); 
    Date madridTime =dstDateTime.toLocalDateTime().toDateTime().toDate(); 


    System.out.println("Melbourne Time -> "+srcDateTime.toDateTime()); 
    System.out.println("Madrid Time -> "+madridTime); 

См. Также;

TimeZone#getRawOffset

TimeZone#getDSTSavings

TimeZone#inDaylightTime

+1

Предоставлено, что он работает без Joda, но ядро Утилиты Java date мучительно разбиты (и заменены на Java 8). Выполнение такой обработки даты с помощью библиотеки Joda является довольно общепринятой лучшей практикой на данный момент. – dimo414

0

java.util.Date объект (не JodaTime) является тем же, независимо от того, что часовой пояс. За кулисами всегда GMT.Вам нужно только беспокоиться о часовом поясе, когда вы разбираете (создаете объект Date) или печатаете его.

Используйте SimpleDateFormat с часовым поясом, установленным на +4, чтобы проанализировать и создать объект Date. Используйте другой SimpleDateFormat с часовым поясом, установленным на +1, чтобы отформатировать тот же объект Date для печати.

Вы можете вызвать setTimeZone на SimpleDateFormat или построить его с помощью строки формата, которая включает часовой пояс. http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html#setTimeZone(java.util.TimeZone)