Avatar billede thinge Nybegynder
17. marts 2002 - 00:24 Der er 20 kommentarer og
1 løsning

Udregning af dage

Jeg har 2 dato: lav os sige 1/4-2002 og 4/3-2002.
Jeg vil gerne regne ud hvor mange dage der er i mellem.

Er der nogen der har en god ide til dette??
Avatar billede disky Nybegynder
17. marts 2002 - 00:41 #1
hvis dine objekter hedder dato1 og dato2

int dif=(dato2.getTime()-dato1.getTime())*1000*60*60*24;


så indeholder 'dif' antal hele dage imellem de to datoer
Avatar billede bearhugx Nybegynder
17. marts 2002 - 00:44 #2
Sådan...

Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
       
c1.set(2002,2,4); // 4. marts 2002
c2.set(2002,3,1); // 1. april 2002
       
long  mills_between = c2.getTime().getTime() -c1.getTime().getTime();
       
Calendar between = Calendar.getInstance();
between.setTimeInMillis( mills_between );
       
System.out.println( between.get(Calendar.DAY_OF_YEAR) );

/Søren
Avatar billede bearhugx Nybegynder
17. marts 2002 - 00:50 #3
Disky ... Mon de multiplikationstegn ikke skulle være divisionstegn ???

Ellers er der (ifølge din løsning) 208707840000000000 dage mellem den 4. marts og den 1. april i år :-)....

/Søren
Avatar billede bearhugx Nybegynder
17. marts 2002 - 00:54 #4
Hvis man udskifter Diskys version med '/' i stedet for '*' så får man 27 dage i mellem de to test-datoer ... Dette er rigtigt, hvis man IKKE tæller de indtastede datoer med (dvs. uden d. 4/3-2002 og 1/4-2002) ...
Ved min løsning bliver de to datoer også inkluderet...

Dvs. diskys løsning (forudsat rettelsen :-) er mere rigtig for at finde dage IMELLEM de to datoer...

/Søren
Avatar billede thinge Nybegynder
17. marts 2002 - 01:47 #5
hvad er der galt med dette når jeg compilere får jeg "cannot resolve symbol" ved Calendar startDag = Calendar.getInstance();

package Faelles.Beans;
import java.util.Calendar.*;

public class Udregning{
    UdregningsBean udregningsBean;
    Calendar startDag = Calendar.getInstance();
    Calendar slutDag = Calendar.getInstance();

    boolean erFaerdig;
   
    public Udregning(){
        udregningsBean = new UdregningsBean();
        erFaerdig = false;
    }
   
    public void startUdregning(int startDag, int slutDag, int startMaaned, int slutMaaned, int startAar, int slutAar){
        int antalDage = 0;
        startDag.set(startAar,startMaaned, startDag);
        slutDag.set(slutAar, slutMaaned, slutDag);
        long  mills_between = c2.getTime().getTime() -c1.getTime().getTime();
        Calendar between = Calendar.getInstance();
        between.setTimeInMillis( mills_between );
        System.out.println( between.get(Calendar.DAY_OF_YEAR));


       
    }
   
    public UdregningsBean getUdregningsBean(){
        return udregningsBean;
    }
}
Avatar billede thinge Nybegynder
17. marts 2002 - 01:50 #6
fejl fundet!!
jeg skal kun importere java.util.*
Avatar billede bearhugx Nybegynder
17. marts 2002 - 01:51 #7
Hvorfor importerer du Calendar.*; ???...

Du skal enten importere java.util.*; eller java.util.Calendar; ikke Calendar.*; ... Calendar er ikke en package ...

/Søren
Avatar billede bearhugx Nybegynder
17. marts 2002 - 01:52 #8
PS : husk at måneder i Java er lidt tricky...
Januar = 0; Februar = 1 osv....

Brug evt. Calendar.JANUARY, hvis muligt...

/Søren
Avatar billede thinge Nybegynder
17. marts 2002 - 01:58 #9
får fejl når dette compileres:
between.setTimeInMillis( mills_between );

Skriver at "setTimeInMillis(long) has protected access in java.util.Calendar
        between.setTimeInMillis( mills_between );
              ^
1 error
Errors compiling Udregning."
Avatar billede bearhugx Nybegynder
17. marts 2002 - 02:00 #10
Hvilken JDK bruger du --- (eksemplet kørte fint hos mig på JDK 1.4 SE)

/Søren
Avatar billede thinge Nybegynder
17. marts 2002 - 02:02 #11
jeg bruger 1.3_1
Avatar billede bearhugx Nybegynder
17. marts 2002 - 02:08 #12
Hmmm... i 1.4'eren er den public - men du har ret - i 1.3'eren er den stadigvæk protected...

Det du gør er at skrive sådan her i stedet
between.setTime( new Date( mills_between ) );

Den skulle være kompatibel med 1.3

/Søren
Avatar billede thinge Nybegynder
17. marts 2002 - 02:37 #13
Kanon Søren det virker.
point til dig
Avatar billede bearhugx Nybegynder
17. marts 2002 - 02:40 #14
Merci Beucoup... (Mange tak!)
Avatar billede bearhugx Nybegynder
17. marts 2002 - 02:48 #15
Du bør dog, i din bean, tjecke for, om startDato kommer før eller efter slutDato ... (Det sidste kan have nogle uheldige konsekvenser)...

Du kan f.eks. gøre sådan her

....

startDag.set(startAar,startMaaned, startDag);
slutDag.set(slutAar, slutMaaned, slutDag);
long mills_between = 0;
if( slutDag.before( startDag ) )
  mills_between = startDag.getTime().getTime() - slutDag.getTime().getTime();
else
  mills_between = slutDag.getTime().getTime() - startDag.getTime().getTime();

...

/Søren
Avatar billede disky Nybegynder
17. marts 2002 - 10:50 #16
Jo selvfølgelig skulle det havde været / :-)

Forresten brug GregorianCalendar istedet for Calender, den tager hensyn til andre problemmer der kan opstå ved brugen af Calendar, Læs API'en
Avatar billede meek Nybegynder
26. maj 2002 - 15:45 #17
jeg kan simpelthen ikke få jeres ovenstående løsning til at fungere. Min kode:

static int antalHeleDage(Calendar cStart, Calendar cSlut) {

    long mills_between = 0;
    if( cSlut.before( cStart ) )
      mills_between = cStart.getTime().getTime() - cSlut.getTime().getTime();
    else
      mills_between = cSlut.getTime().getTime() - cStart.getTime().getTime();

    int dif = ((int) mills_between) / 1000 / 60 / 60 / 24 ;
    System.out.println("Difference: " + dif);
    return dif;


Den returnerer værdien "-13", når jeg giver den datoerne:

2/1-2002 kl. 02:02:02
11/10-2002 kl. 11:11:11

hvad gør jeg galt ??
Avatar billede bearhugx Nybegynder
26. maj 2002 - 15:53 #18
Hvis du istedet skriver

Jeg tror, der går noget galt i din divisioner...

--------
    long mills_between = 0;
    if( cSlut.before( cStart ) )
        mills_between = cStart.getTime().getTime() - cSlut.getTime().getTime();
    else
        mills_between = cSlut.getTime().getTime() - cStart.getTime().getTime();
       
    Calendar between = Calendar.getInstance();
    between.setTime( new Date( mills_between ) );
    return between.get(Calendar.DAY_OF_YEAR) );
---------------

Jeg vil foreslå at du bruger denne indemad i stedet... :-)

/Søren Munk Skrøder
Avatar billede bearhugx Nybegynder
26. maj 2002 - 16:03 #19
Måske kan de også have noget med at du Caster mills_between til int i starten af udregningen ....

Hvis du vil bruge "Dage-Time-Minut-Sekund"-måden, så foreslår jeg følgende i stedet....
----
  long dif = mills_between/(1000*60*60*24);
  return (int)dif;
----

At lave (100*60*60*24)-udregningen først, og så dividere tilsidst, så der kun er en heltalsdivision. Så mister du ikke så mange decimaler (pga. afrunding) i processen.

/Søren
Avatar billede meek Nybegynder
26. maj 2002 - 18:31 #20
jeg har løst den..

jeg tror det er selve substrationen, min løsning ser sådan her ud:

static int antalHeleDage(Calendar cStart, Calendar cSlut) {

    long temp = cSlut.getTime().getTime()/86400000 - cStart.getTime().getTime()/86400000;
    int dif = (int) temp;
    return dif;

  }
Avatar billede meek Nybegynder
26. maj 2002 - 18:32 #21
simpelt ! - tak for dit svar...
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