Несоответствие в unix date command и java simpledateformat

#java #unix

#java #unix — система #unix

Вопрос:

Если я выполняю команду unix

 echo 1378223625 | xargs -L 1 -I '{}' date -d "@{}" " %d-%m-%Y-%H-%M %Z"
  

результатом является 03-09-2013-17-53 CEST

Если я бегу с java

 public class DateExperiment {
    public static void main(String[] args) {
        DateFormat df = new SimpleDateFormat("dd-MM-yyyy-H-m z");
        System.out.println(df.format(1378223625) );
    }
}
  

мой результат таков 16-01-1970-23-50 CET

команда unix дает правильный результат, но java дает мне неправильный результат.

Кто-нибудь может объяснить, почему я получаю это несоответствие? в чем ошибка?

Комментарии:

1. but java is giving me wrong result . Нет, ваши ожидания неверны.

2. Еще один хороший пример того, почему не следует использовать count-since- epoch для обработки значений даты и времени.

Ответ №1:

Если вы используете числовое значение в качестве аргумента to SimpleDateFormat#format(..) , он использует Date конструктор, который ожидает a long . Этот конструктор

Выделяет объект Date и инициализирует его для представления указанного количества миллисекунд, прошедших со стандартного базового времени, известного как «эпоха», а именно 1 января 1970 года, 00:00:00 по Гринвичу.

Указанное вами значение представляет

 16-01-1970-23-50 CET
  

Проблема здесь в том, что у вас есть секунды, а не миллисекунды.

Вы захотите

 System.out.println(df.format(1378223625000L));
  

Ответ №2:

Unix дает вам время в секундах с момента epoch, Java ожидает миллисекунды. Я получаю ожидаемый результат, если умножаю на 1000.

 System.out.println(df.format(1378223625*1000L));
  

Выводит

 03-09-2013-11-53 EDT