Суммируйте две даты в Java

Как я могу добавить две даты в Java?

Пример: сумма "14.01.2010 19:16:17" "0000-10-03 1:10:05"
закончился бы в "17.11.2010 20:26:22".

Я знаю, как сделать это с помощью Календаря и добавив поле полем.

Какой-либо другой путь состоит в том, чтобы суммировать их всех (год/месяц/день/час/минута/второй) сразу?

15
задан bernie 24 January 2010 в 06:47
поделиться

7 ответов

Если вы используете объект даты, вы можете просто сделать:

Date d1 = ...
Date d2 = ...

long sum = d1.getTime() + d2.getTime();

Date sumDate = new Date(sum);

код использует метод .gettime () . Methette () . Отказ Само собой разумеется дата класса , имеет много проблем и следует избегать, когда это можно избежать.

Вы хотите вместо этого выберите другие типы?

Обновление: для календаря , я бы сделал следующее (на основе Javadocs):

Calendar c1 = ...
Calendar c2 = ...
long sum = c1.getTimeInMillis() + c2.getTimeInMillis();
Calendar sumCalendar = (Calendar)c1.clone();
sumCalendar.setTimeInMillis(sum);

Обновлено: как указано Стива, это работает, если Дата, которую вы представили здесь, предполагает, что вторая дата в отношении java ePoch. Если вы хотите начать с года «0», то вам нужно объяснить это (вычитая время эпохи).

27
ответ дан 1 December 2019 в 00:07
поделиться

Вы хотите сделать getTimeInMillis () на обоих тех Календарях, таким образом, у вас будет два кристально честных длинными значения, которые можно сложить. Можно затем взять сумму и спрятать ее в новом Календаре с помощью что Календарь setTimeInMillis () метод.

, Хотите ли вы добавить два Календарь с как показано выше или два Дата , с как показано в ответе notnoop ваше дело, конечно. Эффект подобен, он просто зависит от того, что вы хотите сделать с результатом. Дата главным образом просто хороша для того, чтобы сохранить и/или преобразовать в Последовательность для распечатывания или отображения, тогда как Календарь позволит, вы играть с отдельными временными стоимостями должны вы так выбирать.

, Поскольку другие упомянули, вы фиксируете некоторых концептуальных не в использовании Дата или Календарь , которые предназначены для хранения "реальных" дат и времени, например, в 20-м или 21-й век, как интервалы, т.е. отрезки времени. Классы в стандартной библиотеке Java не дают вам действительно полезные инструменты для обработки этого, которое является, почему классы Joda были разработаны. Все спокойные дети в обработке даты/времени используют их; но с другой стороны который включает загрузку и управление сторонней библиотекой.

3
ответ дан 1 December 2019 в 00:07
поделиться

ответ notnoop определенно корректны. Однако, если вы собираетесь сделать большую обработку дат, времена и интервалы, я предлагаю, чтобы вы посмотрели на класс DateUtils в апачское свободное городское население Ленг и в joda-разовый библиотека.

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

2
ответ дан 1 December 2019 в 00:07
поделиться

Вам нужно определить свою эпоху. Java epoch (как Unix) составляет 1 января 1970 г. GMT / UTC. Я предполагаю, что вы думаете, что вы добавляете десять месяцев, 3 дня и несколько нечетных часов с 1 января 0000, но у вас есть эпоха, до 1970 года. Математика может не обязательно работать.

Используйте календарь или JODA (как уже упоминалось). Если вы просто хотите добавить несколько секунд и дней (& C), а затем не стесняйтесь добавить, как добавить # миллисекунд на ваш объект первого даты.

1
ответ дан 1 December 2019 в 00:07
поделиться

Как всегда, я бы порекомендовал Java 8 Date / Time API или JODA для работы даты / времени, поскольку они много более мощный и интуитивно понятный.

Вы можете добавлять длительные работы и периоды DateTime объекта тривиально. Вы можете добавить минуты / секунды / месяцы одинаково легко.

Однако вы не могут добавить два дата напрямую, так как это не имеет смысла. Это мощная иллюстрация, почему Joda - это помощь - она ​​останавливает, что вы делаете вещи, которые вы действительно не должны делать.

10
ответ дан 1 December 2019 в 00:07
поделиться

Я не удивлен, что не добавлены зависимости области системы (в конце концов, зависимости с областью системы должны быть явно предоставлены по определению). На самом деле, если вы действительно не хотите помещать эту зависимость в ваш локальный репозиторий (например, потому что вы хотите распространить ее как часть вашего проекта), я бы сделал это:

  • я бы поместил зависимость в локальный для проекта «репозиторий файловой системы».
  • Я бы объявил этот репозиторий в моем pom.xml следующим образом:

     < репозитории >
    < репозиторий >
    < id > мой 
    < url > файл ://$ {basedir }/my-repo 
    
    
    
  • Я бы просто объявил артефакт без области системы , это просто источник проблем:

     < зависимость >
    < groupId > sourceforge.jchart2d 
    < artifactId > jchart2d 
    < версия > 3.1.0 
    
    

Я не на 100% уверен, что это соответствует вашим потребностям, но я думаю, что это лучшее решение, чем использование объема системы.

Обновление: Я должен был упомянуть об этом в моем первоначальном ответе и исправляю его сейчас. Для установки сторонней библиотеки в файловом репозитории используйте install: install-file с параметром localRepositurePath :

mvn install:install-file -Dfile=<path-to-file> \
                         -DgroupId=<myGroup> \
                         -DartifactId=<myArtifactId> \
                         -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> \
                         -DlocalRepositoryPath=<path-to-my-repo>

Это можно вставить как есть в оболочку * nix. В окне удалите «\» и поместите все в одну строку.

-121--968380-

restclient не работал на меня, пока я не перепробовал create_file_field в RestClient:: Полезная нагрузка:: Multipart.

Создается «Content-Disposition: multipart/form-data» в каждой части, где должно быть «Content-Disposition: form-data» .

http://www.ietf.org/rfc/rfc2388.txt

Моя вилка здесь, если она нужна: git@github.com: kcrawford/rest-client.git

-121--731880-

Я тоже иногда виноват в этой практике, сохраняя интервал времени в объекте даты и используя getTime (), как предложено notnoop.

Это работает. Вопреки определенному мнению, это, безусловно, работает. Я просто игнорирую, что интервал может быть репрезентативным для непреднамеренной даты. Это быстрый и грязный способ для меня добавить интервал, скажем, [6 лет, 6 месяцев, 6 дней, 6 часов, 6 минут, 6 секунд] к дате.

-1
ответ дан 1 December 2019 в 00:07
поделиться

Не суммируйте время в миллисе двух дат!

Date d1 = new Date();
Date d2 = new Date();
Date dTotal = new Date(d1.getTime() + d2.getTime());
System.out.println(dTotal); // Incorrect! Misses about 1970 years.

Просто клонировать календарь и добавьте детали DateTime один за другим.

Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
Calendar cTotal = (Calendar) c1.clone();
cTotal.add(Calendar.YEAR, c2.get(Calendar.YEAR));
cTotal.add(Calendar.MONTH, c2.get(Calendar.MONTH) + 1); // Months are zero-based!
cTotal.add(Calendar.DATE, c2.get(Calendar.DATE));
cTotal.add(Calendar.HOUR_OF_DAY, c2.get(Calendar.HOUR_OF_DAY));
cTotal.add(Calendar.MINUTE, c2.get(Calendar.MINUTE));
cTotal.add(Calendar.SECOND, c2.get(Calendar.SECOND));
cTotal.add(Calendar.MILLISECOND, c2.get(Calendar.MILLISECOND));
System.out.println(cTotal.getTime()); // Correct!

Само собой разумеется, Jodatime является умнее и уборщите с этим.

10
ответ дан 1 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: