Ошибка Java SimpleDateFormat в формате yyyy

У меня возникают проблемы с методом format объекта SimpleDateFormat.

Данный код:

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(date);

Где "дата" - это объект Date, созданный с использованием длинного int из Calendar.getTimeInMillis();

Calendar cal = Calendar.getInstance();
Date date = new Date(cal.getTimeInMillis());

Все работает отлично, за исключением годовой части строки. Когда я передаю дату, выводимая строка выглядит следующим образом:

0044-09-10 05:30:24 

Передаваемый объект даты создается из длинного целого числа, возвращаемого из:

Calendar.getTimeInMillis();

Я верю, что число, возвращаемое из этого метода, подсчитывает миллисекунды с 1 января. 1970, о котором я думаю, является проблемой, но даже если я добавлю количество миллисекунд в 1970-е годы (lol, возможно, неправильно, но это стоило выстрела: P), он все еще анализирует 0044 в год.

Я сделал многочисленные поисковые запросы Google, и все, кажется, указывают простые проблемы в строке, переданной конструктору SimpleDateFormat, поэтому я здесь не понимаю.

Любая помощь очень ценится.

Пожалуйста, дайте мне знать, нужна ли какая-либо другая информация, и я сделаю все возможное, чтобы предоставить ее.

Еще раз спасибо!

EDIT:

Я решил, что я объясню контекст немного больше:

Техник запустит вызов, и по прибытии на сайт отметит вызов как "Начал". Затем приложение создаст экземпляр Calendar и сохранит long int, возвращенный из Calendar.getTimeInMillis().

Когда технический специалист завершит вызов, он/она будет отмечать вызов как "Завершить". Опять же, создается экземпляр Calendar и сохраняется длинный int, возвращаемый из Calendar.getTimeInMillis().

Это позволяет легко вычислять продолжительность вызова.

Теперь, когда используется закрывающая форма, которую использует техник в приложении, длинные int, сохраненные во время вызовов, передаются объекту Date, который затем передается методу SimpleDateFormat.format().

Здесь возникает проблема. Еще раз спасибо, надеюсь, это помогло.

Ответ 1

Чтобы рассчитать продолжительность между датой/временем, не полагайтесь на вычитание миллисекунд, это очень ненадежно.

Если вы используете Java 8, вы должны использовать новый API java.time, например...

LocalDateTime dt1 = LocalDateTime.of(2014, 9, 11, 10, 0);
LocalDateTime dt2 = LocalDateTime.of(2014, 9, 11, 12, 0);

Duration duration = Duration.between(dt1, dt2);
System.out.println(duration.toDays());
System.out.println(duration.toHours());
System.out.println(duration.toMinutes());
System.out.println(duration.getSeconds());

Какие выходы...

0
2
120
7200

Посмотрите Период и продолжительность для более подробной информации.

В качестве альтернативы вы можете использовать JodaTime (который отключен java.time)

Ответ 2

Время возврата Calendar.getTimeinMillis() - это миллисекунда с момента "эпохи". Консультируя javadoc для класса Date, вы можете обнаружить, что "эпоха" January 1, 1970, 00:00:00 GMT. Таким образом, вы должны быть в порядке. Я тестировал следующий код:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;


public class Cal {

    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        Date date = new Date(cal.getTimeInMillis());

        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(date);

        System.out.println(date);
    }

}

И он дает правильный результат:

Thu Sep 11 09:48:30 KST 2014

Можно подумать, что "продолжительность звонка" - это не дата. Если вы пытаетесь преобразовать результат вычитания между двумя длинными значениями в объект Date, он будет терпеть неудачу, потому что вычитание будет исключать часть времени из-за долгого значения. Результат вычитания составляет всего миллисекунду.

Ответ 3

Хорошо, я решил проблему. Оказывается, я не располагал достаточной информацией для всех, чтобы правильно разобраться в этой проблеме.

В приложении я использую два сборщика: один для даты и один для времени, при сохранении даты, он сохраняет выбранную дату с временем, установленным в 00:00:00, и скрывает это до длинного int миллисекунды.

с помощью:

Calendar cal = Calendar.getInstance();
cal.set(year, month, day);

При сохранении времени оно сохраняет время, выбранное с использованием того же метода, но когда я звонил cal.set(), я устанавливал год, месяц и день, чтобы 0.

то есть.

cal.set(0, 0, 0, hour, minute, second);

изменение этого утверждения на

cal.set(1970, 0, 1, hour, minute, second);

исправлена ​​проблема. Приносим извинения за то, что тратили все время, поскольку это была просто логическая ошибка с моей стороны.

Я искренне ценю всю предоставленную помощь.