Несоответствие в команде unix date и java simpledateformat

1

Если я выполняю команду 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 дает мне неправильный результат.

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

  • 2
    but java is giving me wrong result . Нет, ваши ожидания неверны.
  • 1
    Еще один хороший пример того, почему не следует использовать отсчетную эпоху для обработки значений даты и времени.
Теги:

2 ответа

3

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

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

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

16-01-1970-23-50 CET

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

Вы захотите

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

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

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

Выходы

03-09-2013-11-53 EDT

Ещё вопросы

Сообщество Overcoder
Наверх
Меню