Ошибка 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);
исправлена проблема. Приносим извинения за то, что тратили все время, поскольку это была просто логическая ошибка с моей стороны.
Я искренне ценю всю предоставленную помощь.