Как я могу добавить две даты в Java?
Пример: сумма "14.01.2010 19:16:17" "0000-10-03 1:10:05"
закончился бы в "17.11.2010 20:26:22".
Я знаю, как сделать это с помощью Календаря и добавив поле полем.
Какой-либо другой путь состоит в том, чтобы суммировать их всех (год/месяц/день/час/минута/второй) сразу?
Если вы используете объект даты, вы можете просто сделать:
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», то вам нужно объяснить это (вычитая время эпохи).
Вы хотите сделать getTimeInMillis ()
на обоих тех Календарях, таким образом, у вас будет два кристально честных длинными
значения, которые можно сложить. Можно затем взять сумму и спрятать ее в новом Календаре с помощью что Календарь setTimeInMillis ()
метод.
, Хотите ли вы добавить два Календарь
с как показано выше или два Дата
, с как показано в ответе notnoop ваше дело, конечно. Эффект подобен, он просто зависит от того, что вы хотите сделать с результатом. Дата
главным образом просто хороша для того, чтобы сохранить и/или преобразовать в Последовательность для распечатывания или отображения, тогда как Календарь
позволит, вы играть с отдельными временными стоимостями должны вы так выбирать.
, Поскольку другие упомянули, вы фиксируете некоторых концептуальных не в использовании Дата
или Календарь
, которые предназначены для хранения "реальных" дат и времени, например, в 20-м или 21-й век, как интервалы, т.е. отрезки времени. Классы в стандартной библиотеке Java не дают вам действительно полезные инструменты для обработки этого, которое является, почему классы Joda были разработаны. Все спокойные дети в обработке даты/времени используют их; но с другой стороны который включает загрузку и управление сторонней библиотекой.
ответ notnoop определенно корректны. Однако, если вы собираетесь сделать большую обработку дат, времена и интервалы, я предлагаю, чтобы вы посмотрели на класс DateUtils в апачское свободное городское население Ленг и в joda-разовый библиотека.
JDK7 будет идти с лучшей поддержкой некоторых функций, которые joda-разовый обеспечивают. Просто говоря... это могло бы быть соображение, если ваше приложение делает тяжелое использование этого материала.
Вам нужно определить свою эпоху. Java epoch (как Unix) составляет 1 января 1970 г. GMT / UTC. Я предполагаю, что вы думаете, что вы добавляете десять месяцев, 3 дня и несколько нечетных часов с 1 января 0000, но у вас есть эпоха, до 1970 года. Математика может не обязательно работать.
Используйте календарь или JODA (как уже упоминалось). Если вы просто хотите добавить несколько секунд и дней (& C), а затем не стесняйтесь добавить, как добавить # миллисекунд на ваш объект первого даты.
Как всегда, я бы порекомендовал Java 8 Date / Time API или JODA для работы даты / времени, поскольку они много более мощный и интуитивно понятный.
Вы можете добавлять длительные работы и периоды DateTime объекта тривиально. Вы можете добавить минуты / секунды / месяцы одинаково легко.
Однако вы не могут добавить два дата напрямую, так как это не имеет смысла. Это мощная иллюстрация, почему Joda - это помощь - она останавливает, что вы делаете вещи, которые вы действительно не должны делать.
Я не удивлен, что не добавлены зависимости области системы (в конце концов, зависимости с областью системы должны быть явно предоставлены по определению). На самом деле, если вы действительно не хотите помещать эту зависимость в ваш локальный репозиторий (например, потому что вы хотите распространить ее как часть вашего проекта), я бы сделал это:
Я бы объявил этот репозиторий в моем 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. В окне удалите «\
» и поместите все в одну строку.
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 секунд] к дате.
Не суммируйте время в миллисе двух дат!
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 является умнее и уборщите с этим.