Я хочу Java-программу, которая рассчитывает дни между двумя датами.
- Введите первую дату (немецкая запись; с пробелами: "дд мм гггг")
- Введите вторую дату.
- Программа должна рассчитать количество дней между двумя датами.
Как я могу включить високосные годы и летнее время?
Мой код:
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class NewDateDifference {
public static void main(String[] args) {
System.out.print("Insert first date: ");
Scanner s = new Scanner(System.in);
String[] eingabe1 = new String[3];
while (s.hasNext()) {
int i = 0;
insert1[i] = s.next();
if (!s.hasNext()) {
s.close();
break;
}
i++;
}
System.out.print("Insert second date: ");
Scanner t = new Scanner(System.in);
String[] insert2 = new String[3];
while (t.hasNext()) {
int i = 0;
insert2[i] = t.next();
if (!t.hasNext()) {
t.close();
break;
}
i++;
}
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert1[0]));
cal.set(Calendar.MONTH, Integer.parseInt(insert1[1]));
cal.set(Calendar.YEAR, Integer.parseInt(insert1[2]));
Date firstDate = cal.getTime();
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert2[0]));
cal.set(Calendar.MONTH, Integer.parseInt(insert2[1]));
cal.set(Calendar.YEAR, Integer.parseInt(insert2[2]));
Date secondDate = cal.getTime();
long diff = secondDate.getTime() - firstDate.getTime();
System.out.println ("Days: " + diff / 1000 / 60 / 60 / 24);
}
}
java
date-arithmetic
user3025448
источник
источник
mm
иMM
: PОтветы:
ОБНОВЛЕНИЕ: оригинальный ответ от 2013 года теперь устарел, потому что некоторые классы были заменены. Новый способ сделать это - использовать новые
java.time
классы.Обратите внимание, что это решение даст количество фактических 24 часовых дней, а не количество календарных дней. Для последнего используйте
Оригинальный ответ (устаревший с Java 8)
Вы делаете некоторые преобразования с вашими строками, которые не нужны. Для этого есть
SimpleDateFormat
класс - попробуйте это:РЕДАКТИРОВАТЬ: Поскольку были некоторые дискуссии о правильности этого кода: он действительно заботится о високосных годах. Однако
TimeUnit.DAYS.convert
функция теряет точность, поскольку миллисекунды преобразуются в дни (дополнительную информацию см. В связанном документе). Если это проблема,diff
также можно конвертировать вручную:Обратите внимание, что это
float
значение, а не обязательноint
.источник
String inputString1 = "28 2 2016"; String inputString2 = "1 3 2016";
: 2Самый простой способ:
источник
getDifferenceDays(11PM, 4 AM nextday) == 0
В Java 8 вы можете сделать это, используя
LocalDate
иDateTimeFormatter
. Из Javadoc изLocalDate
:И шаблон может быть построен с помощью
DateTimeFormatter
. Вот Javadoc и соответствующие символы шаблона, которые я использовал:Вот пример:
Пример ввода / вывода с более поздним последним:
С более свежим первым:
Ну, вы можете сделать это как метод более простым способом:
источник
Большинство / все ответы вызвали у нас проблемы, когда наступило летнее время. Вот наше рабочее решение на все даты, без использования JodaTime. Он использует объекты календаря:
источник
Calendar dayOne = (Calendar) day1.clone(), dayTwo = (Calendar) day2.clone();
строки, поскольку они гарантируют, что исходные значения календаря не будут переопределены. Я удалил эти строки, считая их избыточными, и потратил впустую час на то, что значения моего исходного объекта перезаписывались внутри этой функции.Лучший способ, и он превращается в строку в качестве бонуса;)
источник
Использование:
источник
Библиотеки дат Java, как известно, сломаны. Я бы посоветовал использовать Joda Time . Он позаботится о високосном году, часовом поясе и так далее.
Минимальный рабочий пример:
источник
withZone( DateTimeZone.forID( "Europe/Berlin" ) )
. (б) Зачем использоватьLocalDate
вdaysBetween
вызове? Просто передайте объекты DateTime (firstTime, secondTime). Для полных дней звонитеwithTimeAtStartOfDays
. (c) Я бы использовал имена переменных,firstDateTime
а неfirstTime
чтобы избежать двусмысленности между датой, временем и датой-временем. (d) Добавьте несколько try-catch для обработки неверного ввода данных, который не соответствует нашему ожидаемому формату.источник
Когда я запускаю вашу программу, она даже не доходит до того, что я могу ввести вторую дату.
Это проще и менее подвержено ошибкам.
источник
источник
источник