Eu quero um programa Java que calcule dias entre duas datas.
- Digite a primeira data (notação em alemão; com espaços em branco: "dd mm aaaa")
- Digite a segunda data.
- O programa deve calcular o número de dias entre as duas datas.
Como posso incluir anos bissextos e verão?
Meu código:
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
fonte
fonte
mm
eMM
: PRespostas:
ATUALIZAÇÃO: a resposta original de 2013 agora está desatualizada porque algumas das classes foram substituídas. A nova maneira de fazer isso é usar as novas
java.time
classes.Observe que esta solução fornecerá o número real de 24 horas por dia, não o número de dias corridos. Para este último, use
Resposta original (desatualizada a partir do Java 8)
Você está fazendo algumas conversões com suas cordas que não são necessárias. Há uma
SimpleDateFormat
classe para isso - tente o seguinte:EDIT: Como houve algumas discussões sobre a correção desse código: ele realmente cuida dos anos bissextos. No entanto, a
TimeUnit.DAYS.convert
função perde precisão, pois os milissegundos são convertidos em dias (consulte o documento vinculado para obter mais informações). Se isso for um problema,diff
também pode ser convertido manualmente:Observe que este é um
float
valor, não necessariamente umint
.fonte
String inputString1 = "28 2 2016"; String inputString2 = "1 3 2016";
ans: 2Maneira mais simples:
fonte
getDifferenceDays(11PM, 4 AM nextday) == 0
No Java 8, você pode fazer isso usando
LocalDate
eDateTimeFormatter
. Do Javadoc deLocalDate
:E o padrão pode ser construído usando
DateTimeFormatter
. Aqui está o Javadoc e os caracteres padrão relevantes que eu usei:Aqui está o exemplo:
Exemplo de entrada / saída com o último mais recente:
Com o mais recente primeiro:
Bem, você poderia fazer isso como um método de uma maneira mais simples:
fonte
A maioria das respostas causou problemas para nós quando o horário de verão chegou. Aqui está a nossa solução de trabalho para todas as datas, sem usar o JodaTime. Utiliza objetos de calendário:
fonte
Calendar dayOne = (Calendar) day1.clone(), dayTwo = (Calendar) day2.clone();
linhas, pois elas garantem que os valores originais da agenda não sejam substituídos. Excluí essas linhas, considerando-as redundantes e perdi uma hora com o fato de que os valores do meu objeto original estavam sendo substituídos por dentro dessa função.A melhor maneira, e ele se converte em uma String como bônus;)
fonte
Usar:
fonte
As bibliotecas de datas Java são notoriamente quebradas. Eu recomendaria usar o Joda Time . Ele cuidará do ano bissexto, do fuso horário e assim por diante.
Exemplo de trabalho mínimo:
fonte
withZone( DateTimeZone.forID( "Europe/Berlin" ) )
. (b) Por que usarLocalDate
nadaysBetween
chamada? Apenas passe objetos DateTime (firstTime, secondTime). Por dias inteiros, liguewithTimeAtStartOfDays
. (c) Eu usaria nomes de variáveis emfirstDateTime
vezfirstTime
de evitar ambiguidade entre objetos de data, hora e data e hora. (d) Adicione alguma tentativa de captura para manipular dados incorretos que não correspondam ao formato esperado.fonte
Quando executo seu programa, ele nem chega ao ponto em que posso inserir a segunda data.
Isso é mais simples e menos propenso a erros.
fonte
fonte
fonte