-2
votes

Compter le nombre de jours d'un mois donné lorsqu'il est donné une durée

une durée est donnée. Ex: 15 janvier au 15 mars

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

Je cherche une solution autre qui traverse chaque date de la durée et de la vérification si date.getmonth () = "Mois je veux vérifier"

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?


5 commentaires

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 et chronounit.day.between () . N'utilisez pas java.util.date . 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?


3 Réponses :


-1
votes

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. XXX PRE>

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;
    }


1 commentaires

S'il vous plaît, n'enseigne pas les jeunes à utiliser le long obsolète et notoirement gênant SimpleDateDeformat classe. Au moins pas comme la première option. Et non sans aucune réservation. Aujourd'hui, nous avons tellement mieux dans java.time , le Java moderne API DATE ET TEMPS API, et son DateTimeformatter .



1
votes

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.


3 commentaires

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. :-)



2
votes

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();


8 commentaires

Impressionnant. Il est traversant chaque date de la durée , 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 plutôt que mois , 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 . Notez que j'ai géré le partie exclusive de DATESTUNTIL plutôt maladroitement qui doit également être affiné. Peut-être en ajoutant une journée en utilisant plus ()


En option, le deuxième argument au groupingby pourrait être linkedhashmap :: Nouveau pour permettre aux dates d'être affichées dans l'ordre chonologique.


@Wjs Si vous voulez dire DATESTUNTIL 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 dans le 2e argument a fonctionné. Je suis allé avec Treemap au lieu de linkedhashmap , implémentant le triedmap / navigagblap interface plutôt que en fonction de l'ordre d'insertion d'origine.