#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