Avatar billede Slettet bruger
09. april 2007 - 17:12 Der er 10 kommentarer og
1 løsning

Datoer i Java

Hej,

Jeg er ved at lære mig Java ved hjælp af JavaBog.

Jeg er kommet til den opgave, hvor man skal udskive hvad datoen er idag, imorgen, om en uge og om et år.

Det virker fint med imorgen og om en uge, men det passer ikke med om et år. Hvad kan det skyldes tror i?
Kan long evt ikke rumme nok millisekunder til at lægge et helt år til?


Kode:

import java.util.*;

public class DatoImorgenOmEnUgeOgOmEtÅr {
   
    public static void main (String[] args) {
        Date idag = new Date();
        System.out.println("Idag er det: " +idag);
       
        long idagMs = idag.getTime();
       
        Date imorgen = new Date();
        imorgen.setTime(idagMs + 86400000); // der er 86400000 ms på et døgn
        System.out.println("Imorgen er det: " +imorgen);

        Date omEnUge = new Date();
        omEnUge.setTime(idagMs + 7*86400000); // der er 86400000 ms på et døgn
        System.out.println("Om en uge er det: " +omEnUge);
       
        Date omEtÅr = new Date();
        omEtÅr.setTime(idagMs + 365*86400000); // der er 86400000 ms på et døgn
        System.out.println("Om et år er det: " +omEtÅr);
    }
   
}


Resultater ved kørsel:
Idag er det: Mon Apr 09 16:12:13 CEST 2007
Imorgen er det: Tue Apr 10 16:12:13 CEST 2007
Om en uge er det: Mon Apr 16 16:12:13 CEST 2007
Om et år er det: Thu Apr 26 16:52:42 CEST 2007
BUILD SUCCESSFUL (total time: 0 seconds)
Avatar billede Slettet bruger
09. april 2007 - 17:17 #1
Jeg må indrømme at jeg ikke lige kan gennemskue hvad der er problemet, men jeg ved at man generelt skal lade være med at beregne datoer på grundlag af longs.

Javaworld har skrevet en fantastisk god artikel om hvordan man formatteret, beregner og generelt bruger Date, her er linket (håber du kan bruge det til noget):

http://www.javaworld.com/jw-12-2000/jw-1229-dates.html
Avatar billede Slettet bruger
09. april 2007 - 17:21 #2
Okay. Tak for det :-) Jeg prøver lige at kigge på det.

Jeg har fundet ud af, at det passer indtil jeg ganger 24 ind på (altså 24 døgn frem). Herefter bliver datoerne helt forkerte.
Avatar billede arne_v Ekspert
09. april 2007 - 17:24 #3
proev:

omEtÅr.setTime(idagMs + 365L*86400000);
Avatar billede arne_v Ekspert
09. april 2007 - 17:25 #4
den giver 8. april men det er fordi at 2008 er et skudaar !
Avatar billede arne_v Ekspert
09. april 2007 - 17:25 #5
long kan sagtens holde antal milliseknder, men det kan int ikke
og 365*86400000 er int*int=int

L goer at det bliver long*int=long
Avatar billede arne_v Ekspert
09. april 2007 - 17:26 #6
men ioevrigt vil jeg varmt anbefale at bruge en GregorianCalender og add metoden
til at rulle frem med

jeg gaetter paa at den er omtalt i corholios link
Avatar billede Slettet bruger
09. april 2007 - 17:27 #7
Ligger lige et svar, i såfald du kan bruge linket til noget.

Ang. overflow af long, så burde dette ikke givet noget problem - max value af en long er 2 opløftet i 63 minus 1. Det burde også kaste en exception hvis du overskrider denne grænse.
Avatar billede Slettet bruger
09. april 2007 - 17:27 #8
...og der var jeg så lige 1 minut for langsom - selvfølgelig er det pga. skudår :-)
Avatar billede arne_v Ekspert
09. april 2007 - 17:28 #9
og Java smider (desvaerre) ikke exceptions ved integer overflow
Avatar billede Slettet bruger
09. april 2007 - 17:31 #10
Okay. Mange tak til jer begge to. Det virker nu :D
Avatar billede Slettet bruger
09. april 2007 - 20:41 #11
Takker for points :-)
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