une durée est donnée. Ex: 15 janvier au 15 mars p>
Je veux compter le nombre de jours qui appartient à chaque mois, dans cette durée donnée. Dans cet exemple, nombre de jours de janvier de cette durée; 15 Nombre de jours de février de cette durée; 28 Nombre de jours de mars dans cette durée; 15 P>
Je cherche une solution autre qui traverse chaque date de la durée et de la vérification si Y a-t-il un moyen plus facile de le faire en utilisant des méthodes en date de la date de Java ou de la date de Java SQL ou de l'utilisation d'un autre type de date? P> date.getmonth () = "Mois je veux vérifier" code> p>
3 Réponses :
Essayez ceci. Peut être quelque chose comme ça que tu veux. Donc, il définit une startdate et enddate, puis boucle pour chaque papillon de nuit jusqu'à la date de fin et calculez le nombre de jours. Je ne l'ai pas testé à fond, mais devrait être proche de votre concept. Vous pouvez faire la même chose à l'aide de Java.time en Java 8. P> public static void main(String[] args) throws ParseException {
String startDateS = "01/15/2019";
String endDateS = "03/15/2019";
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("MM/dd/yyyy");
LocalDate startDate = LocalDate.parse(startDateS, format1);
LocalDate endDate = LocalDate.parse(endDateS, format1);
while (endDate.compareTo(startDate) > 0) {
LocalDate endOfMonth = startDate.minusDays(startDate.getDayOfMonth()).plusMonths(1);
if( endDate.compareTo(endOfMonth) > 0 )
System.out.println("Count Month " + getMonthForInt(startDate) + " " + getDifferenceDays(startDate, endOfMonth));
else
System.out.println("Count Month " + getMonthForInt(startDate) + " " + getDifferenceDays(startDate, endDate));
startDate = endOfMonth.plusDays(1);
}
}
static String getMonthForInt(LocalDate startDate) {
return startDate.getMonth().getDisplayName(
TextStyle.FULL ,
Locale.US
);
}
public static long getDifferenceDays(LocalDate d1, LocalDate d2) {
// return Duration.between(d2.atStartOfDay(), d1.atStartOfDay()).toDays();
return ChronoUnit.DAYS.between(d1, d2) + 1;
}
S'il vous plaît, n'enseigne pas les jeunes à utiliser le long obsolète et notoirement gênant SimpleDateDeformat code> classe. Au moins pas comme la première option. Et non sans aucune réservation. Aujourd'hui, nous avons tellement mieux dans
java.time code>, le Java moderne API DATE ET TEMPS API,
et son DateTimeformatter code>.
Ceci est juste un exemple simple que j'ai jeté avec une recherche de base.
17 days in Jan. 28 days in Feb. 15 days in Mar.
Et lorsque la question posée pendant 15 jours en janvier, cela doit être un bogue dans la question, pas dans la réponse. 15 janvier au 31 inclus met 17 jours.
@ Olev.v. Honnêtement, je ne pouvais pas vraiment faire des têtes ou des queues de cette partie
Il n'y en avait pas. :-)
Carte Code> avec la syntaxe Lambda Voici une solution utilisant un peu de code terres à l'aide de flux et de lambdas. Bien que cette solution traverse chaque date de la plage de temps, la simplicité et la clarté du code peuvent l'emporter sur cette inefficacité. P>
Utilisez localDate code>
pour la date de démarrage et d'arrêt. Utilisez YearMonth code>
pour suivre chaque mois. p> xxx pré> faire un carte code>
pour conserver un nombre de jours pour chaque mois. P>
long totalDays = d.datesUntil(LocalDate.of(2019, 3, 16)).count();
Impressionnant. Il est traversant chaque date de la durée i>, que le questionneur souhaitait éviter, mais compte tenu de la contrainte, cela en valait la peine dans ce cas.
Solution intelligente. J'ai changé votre code pour utiliser YearMonth code> plutôt que
mois code>, au cas où la plage de dates a passé plus de 12 mois.
Bonne idée. Je n'avais pas vraiment le temps d'y penser jusqu'à ce que j'ai posté la réponse, après avoir regardé localDate code>. Notez que j'ai géré le
partie exclusive code> de
DATESTUNTIL code> plutôt maladroitement qui doit également être affiné. Peut-être en ajoutant une journée en utilisant
plus () code>
En option, le deuxième argument au groupingby code> pourrait être
linkedhashmap :: Nouveau code> pour permettre aux dates d'être affichées dans l'ordre chonologique.
@Wjs Si vous voulez dire DATESTUNTIL CODE> En cours d'exécution, mais non compris, la limite du 16 mars, c'est une fonctionnalité, pas un bug. L'approche semi-ouverte est couramment utilisée pour la manipulation de jour et généralement la voie la plus sage.
Je sais que c'est une fonctionnalité et j'en dépends dans tous les cas de gamme. Je voulais dire que je ne l'ai pas bien géré. Une méthode doit être fournie pour calculer ceci lorsqu'un seul jour est ajouté à la date de fin, transparent à l'utilisateur (si c'est ce que veut le choix).
Ah, Treemap. Un bien meilleur choix.
Instancitation d'un triedmap code> dans le 2e argument a fonctionné. Je suis allé avec
Treemap code> au lieu de
linkedhashmap code>, implémentant le
triedmap code> /
navigagblap code> interface plutôt que en fonction de l'ordre d'insertion d'origine.
SQL apparaît sans importance dans ce contexte
Est-ce une chaîne qui est donnée et vous devez compter le nombre de jours? Avez-vous besoin de nombre de jours pour chaque mois? Année n'est pas présente dans la chaîne?
La date de début est-elle inclusive? Qu'en est-il de la date de fin? Dans l'exemple, voulez-vous compter 14 ou 15 jours de correspondance? Et 28 ou 29 jours de février? Pouvons-nous dire l'année afin que nous puissions déterminer s'il s'agit d'une année bissextile?
Oui, c'est possible, mais la question semble très large et mal étudiée. Utilisez
localDate code> et
chronounit.day.between () code>. N'utilisez pas
java.util.date code>. Cette classe est mal conçue et bien dépassée et malgré le nom ne représente pas une date.
(1-) Qu'est-ce que cela a à voir avec Swing?