Avatar billede halfblind Nybegynder
12. maj 2001 - 16:02 Der er 15 kommentarer og
1 løsning

date

Hejsa...
jeg bruger gregorian calendar for at få vist hvilket ugedag de to datoer jeg taster ind er. Hvordan får jeg en liste over alle de ugedage der ligger imellem de to datoer vist (begge dage incl.)
f.eks. hvis jeg taster 12/5 2001 og 20/5 2001....hvordan får jeg sådan en liste
7   
1
2
3
4
5
6
7
1
(ved godt at jeg også kan får lørdag søndag mandag osv tilbage,men det har jeg ikke brug for lige nu)
Avatar billede disky Nybegynder
12. maj 2001 - 18:09 #1
I klassen Calendar er en metoder der hedder

get(int field);

Brug den til at hente day of week.

For så at udskrive din lise, laver du en løkke der tæller fra 12/5-2001 til 20/5-2001.
Altså de skal lige omregnes til en long begge to.

Og for hvert gennemløb udskriver du day_of_week,

Det get() returnere er så en int der repræsenterer f.eks. SUNDAY. Om mandag f.eks. lige er 1 kan jeg ikke huske men ellers kan du slå det op i din egen tabel.

Håber dette hjælper.

Jeg kan ikke lige lave et eksempel, da denne PC ikke har en JDK installeret :( (hvordan kan man dog leve uden)
Avatar billede halfblind Nybegynder
12. maj 2001 - 18:49 #2
Det er lige det at tælle fra 12/5 til 20/5 jeg ikke ved hvordan jeg skal gøre.

Jeg sender datoen ind til metoden ï denne format:

    int day = in.intRead();
    int month = in.intRead();
    int year = in.intRead();

    GregorianCalendar dagAnkomst = new GregorianCalendar(2001,6,12);

og så selvfølgelig det samme for en den anden dato...
men jeg kan ikke få den løkke til at fungere....det skal jo også virke hvis det ikke er samme måned eller år.

Avatar billede halfblind Nybegynder
12. maj 2001 - 19:45 #3
jeg har fået den nu til at udskrive det som det skulle....
men så snart der er tale om forskellige måneder eller år, går det galt
Avatar billede logical Nybegynder
13. maj 2001 - 10:58 #4
Hej, nogle muligheder:
import java.util.*;
import java.text.*;

        SimpleDateFormat df = new SimpleDateFormat(\"ddMMyy\");
        Date from = null, to = null;
       
        try {
          from = df.parse(\"120501\");
          to = df.parse(\"200501\");
        } catch (ParseException e) {}
       
        GregorianCalendar gc = new GregorianCalendar(new Locale(\"da\",\"DK\"));
        gc.setLenient(true);
        gc.setTime(from);
        // For comparison, we need a calendar object.
        GregorianCalendar gc2 = (GregorianCalendar) gc.clone();
        gc2.setTime(to);
        while(gc.before(gc2)) {
            gc.roll(gc.DAY_OF_MONTH, true);
            int ugedag = gc.get(gc.DAY_OF_WEEK);
            System.out.println(ugedag);
        }
Avatar billede logical Nybegynder
13. maj 2001 - 11:07 #5
Hvad var det dog for noget sludder..

Ret linien:
gc.roll(gc.DAY_OF_MONTH, true)
til:
gc.add(gc.DAY_OF_MONTH, 1);

Sorry :D
Avatar billede rolchau Nybegynder
13. maj 2001 - 12:28 #6
Der mangler lige en dag der.
int førstedag = gc.get(gc.DAY_OF_WEEK);
System.out....
Før løkken
Så får du også start dagen med :-)


       
Avatar billede delbing Nybegynder
13. maj 2001 - 12:30 #7
Download BigDate fra dette website:

http://www.mindprod.com/products.html

BigDate er en utrolig lettelse at arbejde med sammenlignet med Calendar og Date klasserne hvis du kun skal bruge dagen (altså tidspunkt på dagen er ikke nødvendig). BigDate har oså lige præcis en metode der returnerer antal dage mellem to dage.
Avatar billede halfblind Nybegynder
13. maj 2001 - 16:37 #8
dejligt......det virker.
Men for lige at forstå hele koden.
hvad gør metoderne
setTime(from)
setLenient(true)
roll
Avatar billede logical Nybegynder
13. maj 2001 - 16:57 #9
setTime(Date) sætter kalenderen til en given dato
setLenient(true) sikrer, at kalenderen kun opererere med gyldige datoer (da man ellers kan have 31. februar etc).
roll(int field) ruller angivne felt en frem, men laver ikke overflow (Og det skulle du jo bruge), da kalenderen ellers ruller fra 3105 til 0105.

Avatar billede delbing Nybegynder
13. maj 2001 - 17:20 #10
Du har omvendt fat i det med setLenient. Når der fortolkes leniently fortsætter den stille selv om du giver ugyldige datoer - med streng fortolkning smides der exceptions.
Avatar billede rolchau Nybegynder
13. maj 2001 - 17:31 #11
Ja den skal sættes til false i det tilfælde hvis man ikke vil have ugyldig datoer med, men det virker ikke med det stykke kode der. Jeg ved ikke om det kan være fordi at det er GregorianCalendar?!
Avatar billede delbing Nybegynder
13. maj 2001 - 17:45 #12
Hvad mener du? Date from og to er jo sikkert pæne nok, så setLenient er helt overflødig.

Iøvrigt så går den kodestump i uendelig løkke hvis datoerne er fra forskellige måneder, da logical har glemt hvad roll er til.
erstat:
gc.roll(gc.DAY_OF_MONTH, true);
med
gc.add(gc.DAY_OF_MONTH, 1);
           
Avatar billede rolchau Nybegynder
13. maj 2001 - 17:49 #13
Så prøv lige at kører datoen med feks. 999999 den virker fint selvom setLenient er falsk.
Avatar billede delbing Nybegynder
13. maj 2001 - 18:05 #14
Ja, men datoen køres igennem SimpleDateFormat.parse(..), som returnerer et \"pænt\" Date objekt. Dermed når der aldrig en ugyldig dato til GregorianCalendar.

Jeg bliver altså lige nød til at vise hvor nemt det er med BigDate:

        int fromDay = BigDate.toOrdinal(2001, 4, 12);
        int toDay = BigDate.toOrdinal(2001, 4, 20);
        while (fromDay++<toDay) System.out.println(BigDate.dayOfWeek(fromDay));

Avatar billede logical Nybegynder
14. maj 2001 - 07:28 #15
BigDate er sikkert nemt, men koster penge. Og jeg kender ingen der farer ud og køber et kalenderobjekt, bare fordi man lige har et enkelt problem, hvor løsningen ser lidt besværlig ud.

Iøvrigt opdagede jeg selv min roll, hvis du ellers læste hele spørgsmålet igennem, men når programmer bliver klippet ud af sammenhæng, bliver de ofte lidt fejlfyldte.
Avatar billede delbing Nybegynder
14. maj 2001 - 09:24 #16
BigDate koster kun penge hvis du bruger det på mere end 5 computer eller i en kommerciel applikation, og selv i det tilfælde kun $10. Det tog også mig lang tid før jeg anskaffede mig det, fordi det kun lige var et problem der skulle løses. Nu kunne jeg aldrig finde på at trække Date og Calendar frem til datobehandling, BigDate er bare mange gange nemmere at arbejde med.

Angående det med programmet, sorry jeg ikke så din rettelse, jeg forvekslede den med rolchaus kommentar omkring første dag. Og du har helt ret i at man slet ikke skal forvente fejlfri kode her, da folk ofter brygger løsninger sammen on the fly.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester