Если я выполняю команду 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 дает мне неправильный результат.
Может ли кто-нибудь объяснить, почему я получаю это несоответствие? Какая ошибка?
Если вы используете числовое значение в качестве аргумента для SimpleDateFormat#format(..)
, он использует конструктор Date
который ожидает long
. Этот конструктор
Выделяет объект Date и инициализирует его для представления указанного количества миллисекунд с момента стандартного базового времени, известного как "эпоха", а именно 1 января 1970 года, 00:00:00 GMT.
Указанное вами значение представляет
16-01-1970-23-50 CET
Проблема здесь в том, что у вас есть секунды, а не миллисекунды.
Вы захотите
System.out.println(df.format(1378223625000L));
Unix дает вам время в секундах с эпохи, Java ожидает миллисекунды. Я получаю ожидаемый результат, если умножу на 1000.
System.out.println(df.format(1378223625*1000L));
Выходы
03-09-2013-11-53 EDT
but java is giving me wrong result
. Нет, ваши ожидания неверны.