08. marts 2005 - 09:23Der 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?
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...
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;
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)
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 :-))
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 ;-)
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
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...?
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).
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()?
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?
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?
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?
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?
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?
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?
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.
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?
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.
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?
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.
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?
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.
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
Hov ja, det havde jeg helt glemt i glædelsens rus...sorry.
Synes godt om
Ny brugerNybegynder
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.