16. marts 2010 - 12:15Der er
11 kommentarer og 1 løsning
Hvor svært kan det være at regne med DateTime og TimeSpan
Hej eksperter,
Jeg har et tilsyneladende simpelt problem som er ved at drive mig til vanvid. Jeg er ved at lave en applikation som indenfor et givet scenarie (antal dage) kan fortælle mig om en given bruger har fødselsdag og hvor gammel vedkommende er. Scenariet kan enten være +/- en uge fra dags dato, samme dag eller 7 dage frem fra dags dato eller kun samme dag som dags dato. Jeg har endda opsat en unittest som tester applikationen imod en collection af DateTime instanser (fødselsdage) hvor dags dato også bliver stubbet, og det hele ser ud til at virke fint sålænge dags dato ikke ligger indenfor en uge fra nytår (24. december - 7. januar). Men så snart dags dato stubben ligger indenfor dette tidsrum begynder unittesten at fejle...
Jeg har efterhånden set på en del eksempler som alle projectere fødselsdagen frem til dags dato og udregner et TimeSpan således (for +/- en uge fra dags dato):
Dette vil dog ikke virke når todaysDate er tæt på nytåret, men jeg har endnu ikke kunne finde en tilfredsstillende løsning som løser problemet. Er der nogen som har et bud på hvordan det kunne løses?
Er problemet før årsskiftet ikke, at du bruger det aktuelle år: todaysDate.Year, men hvis personen har fødselsdag i januar, så skulle du bruge næste år?
Jo, det er også et af de scenarier jeg har været igennem. Det er iøvrigt også gældende efter årsskiftet, men her skal fødselsdatoen ikke være næste år men indeværende år. På den måde bliver det lynhurtigt noget rodet kode - eksempelvis hvis både dags dato og fødselsdatoen ligger lige før nytår.
Men hvad hvis det i dag var d. 1. januar 2011 og vedkommende var født d. 28. december 2003? Så kommer han ikke med fordi der for det indeværende år ville være 362 dage til hans fødselsdag (eller 363 dage hvis det er skudår) og hhv. 727 og 728 dage i efterfølgende år for ikke-skudår og skudår. Det lyder umiddelbart nemt at rette (træk et år fra personens fødselsdag i indeværende år hvis dags dato netop er passeret nytår), men her er det så jeg synes koden bliver en anelse rodet :-)
Alt dette er inden man overhovedet begynder at overveje alderen på vedkommende, for alderen for en kommende fødselsdag skulle gerne vise hvor gammel personen bliver mens en passeret fødselsdag viser hvor gammel personen er. Jeg siger ikke det er umuligt - jeg savner bare et eksempel som passer.
Hvis du også skal kigge tilbage, skal du lave 3 beregninger: minus et år, aktuelt år, plus et år, og så finde ud om der er een af de tre, der er tilstrækkeligt tæt på.
Jeg takker for begge indlæggere...det ser rigtig nok ikke ud til det skulle blive den hurtigste løsning, men det virker på de datoer jeg kører test på...
En stor tak til Erik og en god bunke point til arne (det virker måske letkøbt, men som sagt var jeg ved at rive hovedet af mig selv over det her problem)
Dette kunne også måske bruges: DateTime dt2 = new DateTime(2010, 1, 1); DateTime dt1 = new DateTime(2009, 12, 31); long ticks = dt1.Ticks - dt2.Ticks; TimeSpan ts = new TimeSpan(ticks); Console.WriteLine(ts.ToString());
Ja ... for hvem siger der er et performance problem.
mvh
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.