2016-09-28 4 views
0

Пожалуйста, смотрите мой код, как показано ниже:Java Calendar.getInstance() изменение часового пояса по умолчанию в Linux

SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 0); 
calendar.set(Calendar.MINUTE, 0); 
calendar.set(Calendar.SECOND, 0); 
calendar.set(Calendar.MILLISECOND, 0); 
sd.setTimeZone(TimeZone.getTimeZone("GMT")); 
System.out.println(sd.format(calendar.getTime())); 
Часовой пояс по умолчанию

Моя система в Windows является EDT в этот момент и время, когда я побежал этот код (28/09/2016 12:27 вечера), и когда я запускаю этот код в системе вывода я получаю, как показано ниже - который предназначен (EDT по Гринвичу Conversion):

28/09/2016 04:00:00 

Но когда я запускаю это на сервере (Выпуск Red Hat Enterprise Linux Server версии 5.11), я получаю следующее:

28/09/2016 00:00:00 

Когда я побежал следующую команду в Linux оболочку

date +%Z 

Он вернулся ниже выхода

EDT 

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

SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
Calendar calendar = Calendar.getInstance(); 
sd.setTimeZone(TimeZone.getTimeZone("GMT")); 
System.out.println(sd.format(calendar.getTime())); 

, которые возвращали ниже выхода (побежал на 28/09/2016 12:36 PM) в том же Linux Server с предполагаемым выходом, который превращает его в GMT

28/09/2016 16:36:46 

Этот код является частью приложения J2EE, работающего на WebLogic 12c. Поделитесь, если у вас есть какие-либо подсказки, что могло бы вызвать вышеупомянутый сценарий. Благодарю.

+0

Если я правильно помню, есть установка в startWeblogic (или аналогичный, это было несколько лет с тех пор я использовал WebLogic), чтобы переопределить систему часовой пояс и использовать GMT (по умолчанию). Вы можете проверить это, зарегистрировав 'Calendar.getInstance(). GetTimeZone(). ToString()' где-то. –

+0

@ElliottFrisch Я проверил это, и он вернул GMT, но я не уверен, как работает второй кусок кода, он не должен его преобразовывать. –

+0

Невозможно воспроизвести проблему с предоставленным кодом. Вы показываете нам настоящий код или код, похожий на реальный код? –

ответ

0

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

28/09/2016 12:27:00 -> 28/09/2016 16:27:00 +0000 

И вот какой тестовый код.

package com.ggl.testing; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.TimeZone; 

public class TimeZoneConversion { 

    public static void main(String[] args) { 
     SimpleDateFormat sdInput = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
     sdInput.setTimeZone(TimeZone.getTimeZone("US/Eastern")); 
     SimpleDateFormat sdOutput = new SimpleDateFormat(
       "dd/MM/yyyy HH:mm:ss Z"); 
     sdOutput.setTimeZone(TimeZone.getTimeZone("GMT")); 

     try { 
      String dateString = "28/09/2016 12:27:00"; 
      Date inputDate = sdInput.parse(dateString); 
      System.out 
        .println(dateString + " -> " + sdOutput.format(inputDate)); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

    } 

} 
+0

Спасибо @GilbertLeBlanc за ввод. Вы правы, полагаясь на системный часовой пояс по умолчанию, была ошибкой, так как конфигурация WebLogic переопределяла часовой пояс по умолчанию, а SimpleDateFormat использовал тот же часовой пояс для преобразования. Итак, добавлен явный часовой пояс в SimpleDateFormat. –

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