Avatar billede backupmand Nybegynder
29. oktober 2003 - 23:48 Der er 27 kommentarer og
1 løsning

Java Date og Calendar tekniske problemer

Jeg har en applikation hvor jeg skal lægge et antal minutter til det nuværende tidspunkt, dette er ikke særligt svært, jeg gør flg:
Calendar c=new GregorianCalendar();
c.set(Calendar.MINUTE, c.get(Calendar.MINUTE)+minutes);

Dernæst udføres en funktion med det fremtidige tidspunkt,
efter udførelsen af denne funktion skal der returneres til det nuværende tidspunkt (der skal resettes til det klokken er nu!), men problemet er at næste gang jeg kalder

c.set(Calendar.MINUTE, c.get(Calendar.MINUTE)+minutes);

Er tidspunktet jeg får fat i det forrige tidspunkt med
det forrige antal minutter tilføjet, således at tidspunktet er rykket minutes minutter yderligere ...
Altså .. eksempel
Klokken er nu 23.00 og jeg skal udføre en funktion med dette klokkeslet + 20 minutter således setter jeg time
til at være lig med time + 20 minutter og jeg har tidspunktet 23.20 ... efter funktionens udførelse skal tidspunktet resettes til 23.00, men tilføjer jeg atter 20 minutter bliver det til 23.40 .. dvs tidspunktet har slet ikke resettet... Hvad fa'n gør jeg galt eller glemmer jeg at gøre .Toppoint for et kvikt svar.
Tak!
Avatar billede backupmand Nybegynder
29. oktober 2003 - 23:50 #1
Det skal siges at jeg efter funktionen med nuværende klokkeslet + minutes gør flg:
c.set(Calendar.HOUR, c.get(Calendar.HOUR));
c.set(Calendar.MINUTE, c.get(Calendar.MINUTE));

Men det er lige vidt ... som om at tiden er "sat" for good og ikke kan ændres
tilbage til det klokken er NU.
Avatar billede arne_v Ekspert
29. oktober 2003 - 23:51 #2
Hvorfor bruger du ikke roll ?
Avatar billede arne_v Ekspert
29. oktober 2003 - 23:53 #3
c.roll(Calendar.MINUTE, minutes);
Avatar billede arne_v Ekspert
29. oktober 2003 - 23:54 #4
Og for at komme tilbage:

c.roll(Calendar.MINUTE, -minutes);
Avatar billede backupmand Nybegynder
29. oktober 2003 - 23:54 #5
kendte ikke funktionens "funktionalitet", da jeg grundet tidspres ikke har nået at udforske api'et, hvilket er en dum undskyldning for ikke at gøre det, har været for doven til at afprøve det. Jeg forsøger lige den funktion, vender tilbage
Avatar billede backupmand Nybegynder
29. oktober 2003 - 23:56 #6
Det er en god ide det der, vender lige tilbage om et par minutter det ser ud som om jeg kan mindske RET mange linjer ved at bruge roll
Avatar billede arne_v Ekspert
29. oktober 2003 - 23:59 #7
Ups.

Du skal nok bruge add og ikke roll !
Avatar billede arne_v Ekspert
29. oktober 2003 - 23:59 #8
Kode:

import java.util.Calendar;
import java.util.GregorianCalendar;

public class FwdBck {
    public static void main(String[] args) {
        Calendar c = new GregorianCalendar();
        System.out.println(c.getTime());
        c.add(Calendar.MINUTE, 20);
        System.out.println(c.getTime());
        c.add(Calendar.MINUTE, 20);
        System.out.println(c.getTime());
        c.add(Calendar.MINUTE, -20);
        System.out.println(c.getTime());
        c.add(Calendar.MINUTE, -20);
        System.out.println(c.getTime());
    }
}
Avatar billede arne_v Ekspert
29. oktober 2003 - 23:59 #9
Output:

Wed Oct 29 23:59:11 CET 2003
Thu Oct 30 00:19:11 CET 2003
Thu Oct 30 00:39:11 CET 2003
Thu Oct 30 00:19:11 CET 2003
Wed Oct 29 23:59:11 CET 2003
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:00 #10
(roll kan ikke klare at køre over "store skift")
Avatar billede backupmand Nybegynder
30. oktober 2003 - 00:05 #11
Betyder ikke den store ændring, vender stadig lige tilbage om c.add(Calendar.MINUTE, -et par minutter);
Avatar billede backupmand Nybegynder
30. oktober 2003 - 00:21 #12
Jeg benytter
c.add(Calendar.HOUR,-currentHours);
c.add(Calendar.MINUTE,-currentMinutes);
Til at  trække minutter og timer fra ... men næste gang
når jeg skal lægge et (andet) antal minutter til har den
ikke fjernet minutterne alligevel.
Jeg benytter c.add(Calendar.MINUTE, minutes); og
minutterne er det forrige antal minutter tilføjet + det nye
antal minutter tilføjet ... tiden er ikke blevet roll'et back
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:25 #13
Det skal vel bare laves parvis.

int min1 = 20;
c.add(Calendar.MINUTE, min1); // 20 frem
// do something
c.add(Calendar.MINUTE, -min1); // 20 tilbage så vi er på start
int min2 = 40;
c.add(Calendar.MINUTE, min2); // 40 frem
// do something
c.add(Calendar.MINUTE, -min2); // 40 tilbage så vi er på start
Avatar billede backupmand Nybegynder
30. oktober 2003 - 00:27 #14
vent lidt det er muligt der er en anden grund, kan snart ikke overskue min kode mere
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:27 #15
Alternative kunne du gemme en clon af dit calendar objekt inden du går igang
med at ændre.

Calendar cc = (Calendar)c.clone();
Avatar billede backupmand Nybegynder
30. oktober 2003 - 00:29 #16
Øh vent lidt
Avatar billede backupmand Nybegynder
30. oktober 2003 - 00:35 #17
Jeg benytter
c.add(Calendar.HOUR,-currentHours);
c.add(Calendar.MINUTE,-currentMinutes);
for at "rolle back" ...
men kalder jeg dernæst
c.getTime() (som returnerer et Date objekt)

Er tiden det "fremtidige" ... må ikke ske
hmm ??
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:38 #18
Du skal rulle det samme tilbage som du rullede frem.
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:38 #19
Umiddelbart lyder current meget som noget absolut og ikke som et
delta
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:39 #20
Men som sagt er et alternativ at klone.

Calendar c = new GregorianCalendar(); // c=nu
Calendar c1 = (Calendar)c.clone(); //c1=c=nu
// modificer c1 som du vil
Calendar c2 = (Calendar)c.clone(); //c2=c=nu
// modificer c2 som du vil
Avatar billede backupmand Nybegynder
30. oktober 2003 - 00:45 #21
Er det du siger, at jeg ikke bare kan rulle et felt tilbage og så få
vist det forrige tidspunkt ved getTime() ?
Avatar billede backupmand Nybegynder
30. oktober 2003 - 00:46 #22
Dvs at modificerer jeg nu C1 og vil jeg gerne have at tiden skal komme
tilbage til C, så roller jeg C1 tilbage ?
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:48 #23
Jo hvis du ruller den samme tid tilbage som du er rullet frem.
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:49 #24
Nej. Du har c=nu og så ruller du frem på kopier af c - og du behøver
ikke at tænke på at rulle tilbage, fordi du laver en ny kopi hver gang
du vil rule frem.
Avatar billede backupmand Nybegynder
30. oktober 2003 - 00:50 #25
Det lyder ret smart
Avatar billede backupmand Nybegynder
30. oktober 2003 - 00:56 #26
perfekt, havde ikke tænkt på dette. Clone er genial i mit tilfælde, jeg bliver sparet for en masse linjer kode og en metode, jeg havde der hed "resetTime()" ... tsk tsk nej jeg kan bare slette denne metode idet jeg ikke opererer på samme Calendar objekt. Ja ja alle de gode ting kommer til dem der venter og arbejder på at få koden til at gå op. Hvis du vil give et svar, vil jeg give dig velfortjente point!
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:58 #27
svar
Avatar billede backupmand Nybegynder
30. oktober 2003 - 01:00 #28
Det er sjovt så lidt jeg får udforsket api'et og bruger rigtigt lang tid på at implementere funktioner selv, som udmærket kunne erstattes af metoder der findes i api'et, blot man tager sig tid til at studere de satans metoder...
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