2013-06-28 5 views
2

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

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 
long processingTime = df.parse("2013-05-20").getTime(); 
System.out.println(processingTime); 

выход равен:

1369033200000 

Но когда я запускаю тот же самый код в Amazon сервер, выход равен:

1369008000000 

Как я могу это исправить?

+0

Возможно, это связано с различными часовыми поясами и/или языковыми настройками на двух машинах? – stakx

ответ

2

Необходимо указать часовой пояс. Лучше использовать библиотеку Joda, в гораздо лучше подходит для даты операций:

http://mvnrepository.com/artifact/joda-time/joda-time/2.2

Взгляните на:

http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormatter.html

и указать часовой пояс и локаль.

Вы можете взглянуть на этот похож вопрос: new Date(long) gives different results

Edit:

Я написал модульный тест для вас:

@Test 
    public void testPattern(){ 
     DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd") 
       .withLocale(Locale.ENGLISH) 
       .withZone(DateTimeZone.UTC); 
     long time = formatter.parseDateTime("2013-05-20").getMillis(); 
     assertEquals(1369008000000L, time); 

    } 

Для того, чтобы убедиться, что это правильно, вы можете запускать свои модульные тесты (я использую плагин maven surefire для запуска теста junit), но этот аргумент будет работать на любом jvm:

Сначала попробуйте запустить его на одной зоне, например:

-Duser.timezone="Europe/Amsterdam' 

Затем попробуйте запустить его в другой зоне, например:

-Duser.timezone="Pacific/Honolulu' 

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