2016-10-27 6 views
2
final static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 

Этот метод сгенерирована неверную дату:SimpleDateFormat.format() дает неверную дату

public static String getDate(double seconds) { 
    Date date = new Date((long)(seconds * 1000)); 
    return dateFormat.format(date); 
} 

Как-то 1465235513.09794 пришел в "2015-06-31T02:33:31.921+0000" - интересная часть 31 июня.

Любой ключ?

+0

редактировать ваш Java-код для отображения кода –

+0

@DonaldWu код был опубликован, просто не отформатирован –

+1

возврата 2016-06-06T17: 51: 53,097 + 0000 для меня .... –

ответ

3

Удивительно, вы используете это в многопоточной программе. Если это так, SimpleDateFormat не является потокобезопасным. Я предпочел бы перемещать dateFormat в метод getDate(). От Javadoc

Форматы даты не синхронизированы. Рекомендуется создавать отдельные экземпляры формата для каждого потока. Если несколько потоков обращаются к формату одновременно, его необходимо синхронизировать извне.

Или использовать Java 8 java.time & DateTimeFormatter, как предложил Джон тарелочкам.

От Javadoc

форматчик, созданный из шаблона можно использовать столько раз, сколько необходимой, она неизменна и потокобезопасно.

или использовать время Joda (если вы не можете использовать Java 8 по каким-либо причинам), как предложил Адриан Шум.

+3

Или, лучше, используйте 'java.time', если это вообще возможно, так как форматы там потокобезопасны, и API, как правило, намного чище ... –

+0

Или, для тех, кому нужно придерживаться Java 7 или ранее, используйте JODA Time :) –

+0

Его запуск внутри многопоточного процесса (Apache Storm). Таким образом, потоки могут иметь место. Спасибо, человек ... это заводило меня орехами .. Я даже не мог воссоздать проблему. –

0
final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
    double seconds = 1465235513.09794; 
    Date date = new Date((long)(seconds * 1000)); //1465235513097 
    String reqDate = dateFormat.format(date); 
    System.out.println(reqDate); // 2016-06-06T23:21:53.097+0530 

См эпохальное время, если есть какой-либо путаницы

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