Je veux un programme Java qui calcule les jours entre deux dates.
- Saisissez la première date (notation allemande; avec des espaces: "jj mm aaaa")
- Tapez la deuxième date.
- Le programme doit calculer le nombre de jours entre les deux dates.
Comment puis-je inclure les années bissextiles et l'heure d'été?
Mon code:
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
utilisateur3025448
la source
la source
mm
etMM
: PRéponses:
MISE À JOUR: La réponse originale de 2013 est maintenant obsolète car certaines des classes ont été remplacées. La nouvelle façon de faire est d'utiliser les nouvelles
java.time
classes.Notez que cette solution donnera le nombre réel de 24 heures-jours, et non le nombre de jours civils. Pour ce dernier, utilisez
Réponse originale (obsolète à partir de Java 8)
Vous effectuez des conversions avec vos chaînes qui ne sont pas nécessaires. Il y a une
SimpleDateFormat
classe pour cela - essayez ceci:EDIT: Depuis qu'il y a eu des discussions concernant l'exactitude de ce code: il prend en effet en compte les années bissextiles. Cependant, la
TimeUnit.DAYS.convert
fonction perd en précision car les millisecondes sont converties en jours (voir la documentation liée pour plus d'informations). Si cela pose un problème,diff
peut également être converti à la main:Notez qu'il s'agit d'une
float
valeur, pas nécessairement d'unint
.la source
String inputString1 = "28 2 2016"; String inputString2 = "1 3 2016";
ans: 2Manière la plus simple:
la source
getDifferenceDays(11PM, 4 AM nextday) == 0
Dans Java 8, vous pouvez accomplir cela en utilisant
LocalDate
etDateTimeFormatter
. Du Javadoc deLocalDate
:Et le modèle peut être construit en utilisant
DateTimeFormatter
. Voici le Javadoc et les caractères de modèle pertinents que j'ai utilisés:Voici l'exemple:
Exemple d'entrée / sortie avec le dernier plus récent:
Avec le plus récent en premier:
Eh bien, vous pouvez le faire en tant que méthode d'une manière plus simple:
la source
La plupart / toutes les réponses nous ont posé des problèmes lorsque l'heure d'été est arrivée. Voici notre solution de travail pour toutes les dates, sans utiliser JodaTime. Il utilise des objets de calendrier:
la source
Calendar dayOne = (Calendar) day1.clone(), dayTwo = (Calendar) day2.clone();
lignes car elles garantissent que les valeurs de calendrier d'origine ne sont pas remplacées. J'ai supprimé ces lignes les pensant redondantes et j'ai perdu une heure sur le fait que les valeurs de mon objet d'origine étaient écrasées de l'intérieur de cette fonction.Le meilleur moyen, et il se convertit en une chaîne en bonus;)
la source
Utilisation:
la source
Les bibliothèques de dates Java sont notoirement cassées. Je conseillerais d'utiliser Joda Time . Il prendra en charge l'année bissextile, le fuseau horaire, etc. pour vous.
Exemple de travail minimal:
la source
withZone( DateTimeZone.forID( "Europe/Berlin" ) )
. (b) Pourquoi utiliserLocalDate
dans l'daysBetween
appel? Passez simplement les objets DateTime (firstTime, secondTime). Pour des journées complètes, appelezwithTimeAtStartOfDays
. (c) J'utiliserais des noms de variablesfirstDateTime
plutôt quefirstTime
pour éviter toute ambiguïté entre les objets date, heure et date-heure. (d) Ajoutez des try-catch pour gérer les mauvaises entrées de données qui ne correspondent pas à notre format attendu.la source
Lorsque j'exécute votre programme, cela ne m'amène même pas au point où je peux entrer la deuxième date.
C'est plus simple et moins sujet aux erreurs.
la source
la source
la source