Avatar billede cogitans Nybegynder
08. marts 2005 - 09:23 Der er 53 kommentarer og
2 løsninger

Trække 2 tidpunkter fra hinanden

Jeg har 2 DateTimeobjekter af formen 12:07:31 (timer, min, sek).
Det ene er et starttidspunkt, det andet et sluttidspunkt. Hvordan får jeg de 2 trukket fra hinanden, så jeg får mellemtiden?
Avatar billede arne_v Ekspert
08. marts 2005 - 09:28 #1
Har du prøvet t2-t1 ?

Hvis jeg husker rigtigt så vil DateTime-DateTime give et TimeSpan.
Avatar billede _just4fun_ Nybegynder
08. marts 2005 - 09:31 #2
der er også lavet en metode til det på DateTime-objektet:

endttime.Subtract(starttime)
Avatar billede cogitans Nybegynder
08. marts 2005 - 09:38 #3
Jeg har ikke prøvet t2-t1, men derimod har jeg prøvet subtract. Men når jeg gør det, så kommer der f.eks. et "-" foran. Så jeg opgav den løsning. Måske var jeg lidt for hurtig dér...
Avatar billede _just4fun_ Nybegynder
08. marts 2005 - 09:39 #4
HEHE, mon ikke du har lavet startttime.Subtract(endtime) :-)
Avatar billede cogitans Nybegynder
08. marts 2005 - 09:44 #5
Det kan jo være :-)
Jeg har skrevet: DateTime abc=sluttid.Subtract(starttid);
Men jeg kommer ikke så langt lige nu. Når jeg prøver, at trække fra hinanden, så skriver kompileren: Cannot implicit convert type 'syste.timespan' to 'system.timedate'.
DateTime sluttid=DateTime.Now;
DateTime starttid=DateTime.Now;
Avatar billede _just4fun_ Nybegynder
08. marts 2005 - 09:49 #6
Det er fordi når du trækker to tidspunkter fra hinanden får du et interval (TimeSpan). Så det skal være
TimeSpan abc=sluttid.Subtract(starttid); (som også arne nævnte)
Avatar billede cogitans Nybegynder
08. marts 2005 - 09:52 #7
Altså, når man holder cursoren over "subtract", så står der "system.DateTime DataTIme.subtract....". Betyder det ikke, at returtypen er DateTime?
Avatar billede cogitans Nybegynder
08. marts 2005 - 09:59 #8
Hmm...når jeg skriver:
TimeSpan abc=sluttid.Subtract(starttid);
int a=abc.Hours;
int b=abc.Minutes;
int c=abc.Seconds;
Label20.Text=a.ToString() + ":" + b.ToString() + ":" + c.ToString();

Så bliver resultattet:
artid: 9:57:8 Sluttid: 9:57:12 Brugt tid: 9:57:12
Hvordan det?
Avatar billede cogitans Nybegynder
08. marts 2005 - 10:03 #9
Burde den ikke give det tidsrum, som netop ligger mellem de 2 tidspunket, der trækkes fra hinanden?
Avatar billede _just4fun_ Nybegynder
08. marts 2005 - 10:06 #10
jo, og det gør den også. Subtract er overloadet så den returnerer timespan hvis datetime er parameteren, og datetime hvis timespan er parameteren.
Måske er det fordi starttid ikke er sat?!?! (passer meget godt med 9:57 er... for 10 minutter siden :-))
Avatar billede quarter Nybegynder
08. marts 2005 - 10:08 #11
Burde det ikke gøre...
Det output resultat du viser hænger jo slet ikke sammen med det kode du skriver?
Avatar billede cogitans Nybegynder
08. marts 2005 - 10:11 #12
Ah, okay. (mht. timespand/datetime)
Starttid og sluttid bliver sat, som jeg skrev i 08/03-2005 09:44:47.
Ang. det med "10 min siden" er fordi, det jo tager lidt tid, før svaret kommer herinde ;-)
Avatar billede cogitans Nybegynder
08. marts 2005 - 10:14 #13
Passer koden ikke?
Min kode er:

if(Button2.Text.Equals("Start ur"))
            {
                starttid=DateTime.Now;
                Label16.Text=starttid.Hour + ":" + starttid.Minute + ":" + starttid.Second;               
            }
            if(Button2.Text.Equals("Slut ur")){
                sluttid=DateTime.Now;
                Label18.Text=sluttid.Hour + ":" + sluttid.Minute + ":" + sluttid.Second;   
                string mellemtidSlut=sluttid.ToLongTimeString(); //da subtract trækker tiden fra det først angivne
                string mellemtidStart=starttid.ToLongTimeString();
       
                TimeSpan abc=sluttid.Subtract(starttid);
           
                int a=abc.Hours;
                int b=abc.Minutes;
                int c=abc.Seconds;
                Label20.Text=a.ToString() + ":" + b.ToString() + ":" + c.ToString();//tidsforskel
                Label22.Text="";
            }
Avatar billede cogitans Nybegynder
08. marts 2005 - 10:21 #14
Forskelstiden bliver =sluttidspunktet. Er det fordi, "subtract" ikke benyttes rigtigt?
Avatar billede quarter Nybegynder
08. marts 2005 - 10:33 #15
private DateTime starttid, sluttid;
-----------------------------------
private void button1_Click(object sender, System.EventArgs e)
{
    starttid = DateTime.Now;
    label1.Text=starttid.Hour + ":" + starttid.Minute + ":" + starttid.Second;     
}

private void button2_Click(object sender, System.EventArgs e)
{
    sluttid = DateTime.Now;
    label2.Text=sluttid.Hour + ":" + sluttid.Minute + ":" + sluttid.Second;
}

private void button3_Click(object sender, System.EventArgs e)
{
    TimeSpan abc=sluttid.Subtract(starttid);
    int a=abc.Hours;
    int b=abc.Minutes;
    int c=abc.Seconds;
    textBox3.Text=a.ToString() + ":" + b.ToString() + ":" + c.ToString();
}

Giver 0:0:2 ved 10:30:32 og 10:30:34 ... Det ser også rigtigt ud din kode... Jeg forstår det ikke lige...
Avatar billede cogitans Nybegynder
08. marts 2005 - 10:37 #16
AHH - det er fordi, at starttid=DateTime.Now; sætter starttiden til: 0000:00:00:00 (kan jeg se under "debug"). Hvorfor gør den det?
Avatar billede arne_v Ekspert
08. marts 2005 - 11:13 #17
Lidt mystisk.

            DateTime dt1 = DateTime.Now;
            Thread.Sleep(10000);
            DateTime dt2 = DateTime.Now;
            TimeSpan ts = dt2 - dt1;
            Console.WriteLine(ts);

virker fint hos mig.
Avatar billede cogitans Nybegynder
08. marts 2005 - 13:05 #18
Det er meget mærkeligt.
Hvis jeg skriver din kode, så giver det et fornuftigt resultat.
Når jeg så overfører det til min kode, så skriver den: 732012.13:02:16.2853418

Koden er her:

DateTime sluttid=new DateTime();
            bool check=false;
            if(Button2.Text.Equals("Start ur"))
            {
                starttid=DateTime.Now;
                Label16.Text=starttid.Hour + ":" + starttid.Minute + ":" + starttid.Second;               
            }
            if(Button2.Text.Equals("Slut ur")){
                Thread.Sleep(5000);
                sluttid=DateTime.Now;
                Label18.Text=sluttid.Hour + ":" + sluttid.Minute + ":" + sluttid.Second;   
       
                TimeSpan abc=sluttid-starttid;
   
                System.Diagnostics.Debug.Write("**********************************");
                System.Diagnostics.Debug.Write(abc);
Label20.Text=abc.ToString();//tidsforskel
                Label22.Text="";

Hvad er forklaringen?
Avatar billede arne_v Ekspert
08. marts 2005 - 13:10 #19
Bliver:

            if(Button2.Text.Equals("Start ur"))
            {
                starttid=DateTime.Now;
                Label16.Text=starttid.Hour + ":" + starttid.Minute + ":" + starttid.Second;             
            }
kørt ?
Avatar billede cogitans Nybegynder
08. marts 2005 - 13:18 #20
Ja, sådan lyder teksten på knappen jo ved start. Når man så trykker på knappen, så ændrer teksten sig til "Slut ur".
Avatar billede cogitans Nybegynder
08. marts 2005 - 13:25 #21
Det er fordi, at starttid ikke bliver sat korrekt. Under debug lige efter, den er sat, bliver den: 01-01-0001 00:00:00. Hvorfor sker dette ?
Avatar billede cogitans Nybegynder
08. marts 2005 - 13:27 #22
Hvis jeg checker starttid inde i if-sætningen, hvor den bliver sat, så står den rigtigt. Men når jeg checker starttid lige efter if-sætningen, så er den nulstillet...?
Avatar billede arne_v Ekspert
08. marts 2005 - 13:31 #23
Du har ikke mere end en starttid vel ?
Avatar billede cogitans Nybegynder
08. marts 2005 - 13:33 #24
Nej, jeg har kun 1 starttid og 1 sluttid, som bliver initialiseret i toppen af koden (hvor alle labels, buttons, osv. bliver).
Avatar billede arne_v Ekspert
08. marts 2005 - 13:34 #25
Fordi:

if(Button2.Text.Equals("Start ur"))
            {
                DateTime starttid=DateTime.Now;
                Label16.Text=starttid.Hour + ":" + starttid.Minute + ":" + starttid.Second;           
            }

kunne give den effekt.
Avatar billede cogitans Nybegynder
08. marts 2005 - 13:40 #26
Hvilken effekt omtaler du?
Grunden til, at jeg ikke har initialliseret starttid inde i if-sætningen er, at så kan jeg jo ikke arbejde med den udenfor if-sætningen (til når jeg skal regne forskellen ud).
Avatar billede cogitans Nybegynder
08. marts 2005 - 13:41 #27
Nåå, altså dobbelt initiallisereing? Jo, men det problem skulle jeg have elimineret ved at initialisere variablerne i toppen af koden.
Avatar billede quarter Nybegynder
08. marts 2005 - 13:41 #28
starttid er lig med 01-01-0001 00:00:00, hvis starttid endnu ikke er blevet sat, eller er blevet sat til new DateTime(). Det kunne måske tyde på at du i din metode altid får sat starttid = new DateTime()?
Avatar billede cogitans Nybegynder
08. marts 2005 - 15:35 #29
Det kunne jo selvfølgelig være. Men gør jeg det ikke rigtigt, når jeg gør som beskrevet i: 08/03-2005 10:14:40 ?

Noget andet er, at jeg før har oplevet, at VS ikke kan finde ud af at kompilere ordentligt. Derfor vil jeg gerne slette alle midlertige filer og alle kompilerede filer, så jeg er sikker på, at det er den sidst nye version af kompileret kode. Hvordan er det nu lige, at jeg sletter alle de filer/informationer?
Avatar billede quarter Nybegynder
08. marts 2005 - 15:49 #30
Pseudo:
starttid = new datetime();
if ("start ur")
{
starttid = datetime.now;
}
if ("slut ur")
{
sluttid = datetime.now;
udregnTidsforskel;
}

Så vil du jo når du trykker slut ur, overskrive den starttid du fik da du trykkede start ur, i og med at starttid = new datetime().

Til det andet: Prøv at rebuilde solution.
Avatar billede spif2001 Nybegynder
08. marts 2005 - 16:05 #31
Filerne du skal slette er alle de binære (dll og exe filer) under diverse bin/debug og bin/release biblioteker

spif2001 ;)
Avatar billede cogitans Nybegynder
08. marts 2005 - 16:17 #32
TJa, det har du da selvfølgelig ret i Quarter. Jeg kan nu ikke tro, at jeg ikke selv har set dette :-). Da jeg er på arbejde nu, kan jeg ikke checke det.
Men det vil jeg selvfølgelig lige checke, når jeg kommer hjem.

Jeg rebuilder jævnligt. Overskriver en "rebuild" alle hidtil kompileret filer? Er det ikke mere sikkert, hvis man fysisk sletter alle de hidtid kompileret filer?
Avatar billede cogitans Nybegynder
08. marts 2005 - 23:03 #33
Nej, som jeg gik ud fra, så initialiserer jeg variablerne øverst i koden (altså dér, hvor alle variable på formen angives).
Avatar billede cogitans Nybegynder
08. marts 2005 - 23:04 #34
Jeg har også prøvet, at slette filer nu, men uden held....?
Avatar billede cogitans Nybegynder
09. marts 2005 - 09:25 #35
Hele problemet opstår som følge af, at jeg sætter variablerne inde i if-sætningerne. Hvis jeg laver det hel udenfor if-sætningerne (som i 08/03-2005 11:13:29), så går det fint. Men inde i if-sætningerne, så bliver facit noget mærkeligt. Variablerne er initialiseret udenfor if-sætningerne. Hvad kan problemet - og løsningen derpå - være?
Avatar billede cogitans Nybegynder
09. marts 2005 - 23:04 #36
Ahh, nu har fundet fejlen. If-sætningerne forårsager jo et postback til serveren. Det er derfor, at serveren ikke husker på første gang, at knappen blev trykket. Og derfor det forkerte resultat. Jeg havde tænkt mig, at benytte sessions. Men jeg har fået indtryk af, at viewstate er bedre egnet i mit tilfælde. Er dette tilfældet?
Hvad er plus og minus mht. sessions kontra viewstate?
Avatar billede burningice Nybegynder
11. marts 2005 - 10:58 #37
WHUT!?!... sidder du og starter en timer på serveren, og forventer at den skal huske den timer næste gang der laves postback? dine objecter bliver jo oprettet på ny næste gang siden bliver loadet

(til en anden gang, der findes en asp.net kategori)

hvorfor foretager du ikke tidtagningen direkte på klienten via javascript?
Avatar billede cogitans Nybegynder
11. marts 2005 - 11:05 #38
Ja, jeg fik jo nok plaseret spørgsmålet lidt forkert...
Jeg bruger ikke javascript, da det er et krav, at det foregår vha. c#.
Der er ikke nogle som ved, hvad plus og minus mht. sessions kontra viewstate er?
Avatar billede burningice Nybegynder
11. marts 2005 - 11:19 #39
I dit tilfælde går jeg ud fra at start-timeren skal blive ved med at køre efter at siden er processeret og sendt tilbage til klienten? i så fald skal du bruge session, da viewstate vil stoppe din timer og starte den igen fra hvor den slap. Faktisk er jeg ikke engang sikker på at man kan serialisere en timer.
Avatar billede cogitans Nybegynder
11. marts 2005 - 12:39 #40
Jeg benytter objektet DateTime, så det er lige meget, om timeren stoppes eller ej. Det problem er løst.
Jeg vil derimod gerne vide, hvad forskellen er på Session og Viewstate?
Avatar billede burningice Nybegynder
11. marts 2005 - 17:37 #41
ja, sorry... blander Timer og DateTime sammen. Med DateTimer kan du benytte både session og viewstate.

Hvad forskellen er? Viewstate er når du serialiserer dine objecter ned i en tekstreng og sender den med siden til clienten. Når clienten så laver postback kan man deserialerese tekstrengen igen og få genskabt objecterne som de så ud da de blev serialiseret.

Session er bare en måde at gemme dine objecter på så de ikke går ud af scope når at siden er færdig med at eksvekvere. Dvs. at det foregår på selve serveren og har man for mange objecter flydende kan det godt gå hen og bruge en del hukommelse.

Fordele/ulemper?

Session kræver cookie, med mindre man kører med cookieless sessions. Den nedlægges også efter et tidsrum uden aktivitet. Dog sparer den en del på båndbredden.

Viewstate er fuld kompatibel med alle browsere der kan forstå http. Det beslaglægger ikke hukommelse, men sluger til gengæld en del båndbredde.
Avatar billede cogitans Nybegynder
11. marts 2005 - 19:13 #42
Okay - kan man så sige, at session er en avanceret version af viewstate?
Altså når viewstate kun kan have en enkelt streng i sig, hvor session kan have adskellige objekter i sig?
Avatar billede burningice Nybegynder
11. marts 2005 - 19:47 #43
jeg skrev

serialiserer dine objecter ned i en tekstreng

Altså kan du serialisere lige så mange objecter du har lyst, tekststrengen bliver bare det længere.

nej, man kan ikke helt sammenligne session og viewstate. De bliver generelt brugt til vidt forksellige ting. Viewstate bliver oftest bliver brugt til at gemme oplysninger om hvordan en side skal se ud, deraf navnet. Hvilke items der var i en dropdownliste så man ikke skal loade fra databasen hver gang, hvilken side et page datagrid var på og den slags ting, hvor session bruges til cross page ting. Dvs. ting der skal deles mellem alle sider, en indkøbskurv, login information m.m.
Avatar billede cogitans Nybegynder
11. marts 2005 - 20:15 #44
Men er en session så ikke mest praktisk? Altså kan man lige så hurtigt hente oplysninger ud fra viewstate som ud fra session?
Man kan da også godt gemme oplysninger om, hvordan siden skal fremstå, i session. Er det så bare, hvad det sædvanligvis/vane bliver brugt til?
Avatar billede burningice Nybegynder
11. marts 2005 - 20:27 #45
du kan godt gemme hvordan en side så ud i session, men hvordan vil du så skelne mellem forskellige sider?
Avatar billede cogitans Nybegynder
11. marts 2005 - 20:39 #46
Der er da vel mere eller mindre uendelige index's i sessionen, hvor man kan gemme data? Og så kan man da nok finde plads til info om siderne også...
Avatar billede _just4fun_ Nybegynder
11. marts 2005 - 21:02 #47
offTopic??
Avatar billede burningice Nybegynder
11. marts 2005 - 21:27 #48
jo, men hvordan kobler du en enkelt side sammen med et index... og risikerer du så ikke at brugere mere og mere og mere og mere hukommelse på serveren indtil den siger stop? Hvornår skal info om hvordan siden så ud slettes igen?

nej, jeg mener ikke det er offtopic da det klart er et spørgsmål omkring grundlæggende begreber og forståelse.
Avatar billede cogitans Nybegynder
11. marts 2005 - 23:45 #49
Kan man så have flere viewstates i en aplikation, som har flere sider?

Kan cyberfessor og arne_v ikke lægge et svar ind? Så deler de nemlig pointene.
Avatar billede arne_v Ekspert
12. marts 2005 - 08:45 #50
ok
Avatar billede arne_v Ekspert
12. marts 2005 - 08:45 #51
jeg må melde pas til viewstate
Avatar billede burningice Nybegynder
12. marts 2005 - 09:25 #52
en viewstate er fysisk koblet til en side, så det belaster ikke serveren. Eneste serveren skal gøre er

1) når der laves et postback tjekker den om der er en viewstate-streng den kan deserialisere, og i så fald gør den det og bruger den information til at restore alle objecterne på siden til den state de var i når viewstaten blev lavet
2) hvis viewstate er enablet får alle objecter lov til at gemme deres viewstate. Det er altså noget man som udvikler selv skal sørge for at drage nytte af.

Rent teknisk fungerer det på denne måde:

Læs fra viewstate object o = ViewState["enKey"];
Skriv til viestate ViewState["enKey"] = o;

o kan indeholde alle typer objecter der kan serialiseres. Dog bør man være påpasselig da det som sagt sluger en del båndbredde.

Du kan læse meget mere om viewstate og hvad det kan bruges til, og ikke bruges til, her

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspnet/html/asp11222001.asp
Avatar billede burningice Nybegynder
12. marts 2005 - 09:26 #53
og det var det svar :)
Avatar billede arne_v Ekspert
10. april 2005 - 18:03 #54
cogitans>

så mangler du bare at acceptere
Avatar billede cogitans Nybegynder
10. april 2005 - 19:52 #55
Hov ja, det havde jeg helt glemt i glædelsens rus...sorry.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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