Avatar billede starf Nybegynder
05. oktober 2011 - 13:19 Der er 31 kommentarer og
1 løsning

læg minuter til en dato

Jeg har en string der indeholder dato og tid i følgende format:

19-09-2011 08:00:00

så har jeg en anden string der indeholder et tal, f.eks. 450, hvordan lægger jeg dette til min dato string, som minuter? og der efter kun printer den tid der bliver lavet?
Avatar billede johny Nybegynder
05. oktober 2011 - 13:29 #1
System.DateTime.Parse("19-09-2011 08:00:00").AddMinutes(450).ToString()
Avatar billede Tobyyyy Nybegynder
05. oktober 2011 - 13:30 #2
Jeg går ud fra at du har den første dato, som en string. Du kunne evt. prøve at kigge på klassen DateTime. Så er det nemlig bare at .AddMinutes på datoen :)

DateTime dato = new DateTime(2011,09,19,0,0,0);
dato.AddMinutes(450);
Avatar billede baitianlong Nybegynder
05. oktober 2011 - 13:35 #3
string datestring = "19-09-2011 08:00:00";
string pattern = "dd-MM-yyyy HH:mm:ss";
DateTime olddate = DateTime.ParseExact(datestring, pattern, null);
DateTime newdate = olddate.AddMinutes(450);
string newdatestring = newdate.ToString(pattern);
Avatar billede starf Nybegynder
05. oktober 2011 - 13:41 #4
Umildtbart har jeg fundet date.addminutes funktionen, og den del virker, lige indtil jeg forsøger at bruge min string som værdi.

Her er min kode

System.IO.TextReader sr = new System.IO.StreamReader(@"C:/Temp/Kalender.txt", System.Text.Encoding.GetEncoding("iso-8859-1"));

string contents = sr.ReadToEnd();
string[] lines = contents.Split(new string[] { "\r\n" }, System.StringSplitOptions.RemoveEmptyEntries);

var strongTypedLines = lines
              .Select(s => s.Split('\t'))
              .Select(s => new { Date = System.DateTime.Parse(s[0]), Name = s[1], Varighed = s[2] });
System.Text.StringBuilder minstreng = new System.Text.StringBuilder();
foreach (var kalenderdata in strongTypedLines.OrderBy(item => item.Date))


{

if (DateTime.Now <= kalenderdata.Date)
{
                   
minstreng.Append(string.Format("{0} - {1} - Varighed: {2} Min.", kalenderdata.Date, kalenderdata.Name, kalenderdata.Varighed));
minstreng.Append(System.Environment.NewLine);
}
else
{
}


}

som i kan se har jeg kalenderdata.Date og kalenderdata.Varighed, som indeholder et minut antal. Det jeg enlig skal have lavet er noget hen af dette:

minstreng.Append(string.Format("{0} - {1} - Slut Kl: {2} Min.", kalenderdata.Date, kalenderdata.Name, kalenerdata.Date.AddMinutes(kalenderdata.Varighed)));

dette virker dog ikke rigtigt?
Avatar billede Tobyyyy Nybegynder
05. oktober 2011 - 13:44 #5
Du har set at du har stavet kalenderdata forkert der hvor du prøver at tilføje .addminutes? :)

Der står: kalenerdata
Avatar billede starf Nybegynder
05. oktober 2011 - 13:47 #6
det er bare en slå fejl her inde, i koden er det rigtigt:
minstreng.Append(string.Format("{0} - {1} - Varighed: {2} Min.", kalenderdata.Date, kalenderdata.Name, kalenderdata.Date.AddMinutes(kalenderdata.Varighed)));

der ud over er der jo også problemet, med den KUN skal skrive klok, og ikke fuld dato osv.
Avatar billede Syska Mester
05. oktober 2011 - 14:38 #7
DateTime.Now.ToShortTimeString()

dvs.

kalenderdata.Date.AddMinutes(kalenderdata.Varighed).ToShortTimeString();

ellers kig på: http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.71).aspx

For mange andre måder at lave din string på.

mvh
Avatar billede starf Nybegynder
05. oktober 2011 - 14:44 #8
problemet er stadig den jeg får:
Error    1    The best overloaded method match for
Error    2    Argument 1: cannot convert from 'method group'

på:
minstreng.Append(string.Format("{0} - {1} - Varighed: {2} Min.", kalenderdata.Date, kalenderdata.Name, kalenderdata.Date.AddMinutes(kalenderdata.Varighed)));
Avatar billede johny Nybegynder
05. oktober 2011 - 15:28 #9
Udskift

var strongTypedLines = lines
              .Select(s => s.Split('\t'))
              .Select(s => new { Date = System.DateTime.Parse(s[0]), Name = s[1], Varighed = s[2] });

med:

var strongTypedLines = lines
              .Select(s => s.Split('\t'))
              .Select(s => new { Date = System.DateTime.Parse(s[0]), Name = s[1], Varighed = double.Parse(s[2]) });
Avatar billede Syska Mester
05. oktober 2011 - 15:29 #10
Du får ikke "stadig" ... det er første gang vi har fået overstående at vide.

Alt post compiler fejl.

Du skal have konverteret Varighed til en Interger.

int.Parse(s[2])
Avatar billede starf Nybegynder
06. oktober 2011 - 08:29 #11
ok så får den da lagt det sammen uden det giver problemer, kan man i samme steng som denne:

kalenderdata.Date.AddMinutes(kalenderdata.Varighed)

også lave så den kun viser klokken? altså hh:mm ?
Avatar billede starf Nybegynder
06. oktober 2011 - 08:35 #12
kalenderdata.Date.AddMinutes(kalenderdata.Varighed).ToShortTimeString())); dette virker så faktisk super godt, sku lige læse lidt op. Jeg takker for hjælpen, i bør nok deles om point eller?
Avatar billede starf Nybegynder
06. oktober 2011 - 10:47 #13
bonus spørgsmål, hvis jeg vil bruge take(1) på en af tingene, f.eks.

foreach (var kalenderdata in strongTypedLines.OrderBy(item => item.Date).Take(1))

hvordan gør jeg så det? sådan der, får jeg nemlig intet output, går ud fra det har noget med:

var strongTypedLines = lines
                          .Select(s => s.Split('\t'))
                          .Select(s => new { Date = System.DateTime.Parse(s[0]), Name = s[1], Varighed = double.Parse(s[2]) });

at gøre?
Avatar billede johny Nybegynder
06. oktober 2011 - 10:59 #14
Det må have noget at gøre med andet af din kode, for Take(1) returnerer blot 1 række (det præcis samme som FirstOrDefault gør), og strongTypedLines koden ændrer sig ikke af at du bruger Take.

Men har du prøvet at debugge koden? Rent faktisk se hvad den forsøger at skrive ud? Sæt et breakpoint på linjen med foreach, og 1) se hvad "strongTypedLines" faktisk indeholder, og 2) tryk F10 og se om du faktisk kommer ind i din foreach kode.
Avatar billede starf Nybegynder
06. oktober 2011 - 11:08 #15
ja hvis jeg gør det, kan jeg se det indeholder godt nok data, og det rigtige data. Det der undre mig, hvis jeg bruger take på koden hvor jeg ikke sortere efter dato, virker det fint. Men jeg må vel rode lidt med det.
Avatar billede johny Nybegynder
06. oktober 2011 - 11:14 #16
hvad hvis du bruger Take(5)?
Avatar billede starf Nybegynder
06. oktober 2011 - 11:23 #17
take(5) og take(100)

giver heller intet... måske problemet ligger i at jeg i en if, kun printer hvis dato er størrer eller = idag.

foreach (var kalenderdata in strongTypedLines.OrderBy(item => item.Date).Take(100))

{

if (DateTime.Now <= kalenderdata.Date)
{
minstreng.Append(string.Format("{0} - {1} - Slut Tid: {2} Min.", kalenderdata.Date, kalenderdata.Name, kalenderdata.Date.AddMinutes(kalenderdata.Varighed).ToShortTimeString()));
minstreng.Append(System.Environment.NewLine);

                 
}
else
{
}
Avatar billede johny Nybegynder
06. oktober 2011 - 11:28 #18
Du kan jo sætte et breakpoint i din "else" del, så kan du se at du havner der. Hvis du gør, skyldes det at "DateTime.Now <= kalenderdata.Date" returnerer false, hvilket er det samme som at sige, at datoen ikke ligger i fremtiden.
Avatar billede starf Nybegynder
06. oktober 2011 - 11:34 #19
hmm der ligger over 200 linier if delen af koden, hmmm er der ikke en måde at sætte en limit på if delen så den bare kun skriver engang der? eller så skal det hele måske flyttes ud af foreach?
Avatar billede Syska Mester
06. oktober 2011 - 13:08 #20
Hvorfor smider du ikke en Where ind i en LINQ sætning, i stedet for at sortere dem fra med en "if" bagefter i din foreach loop ?

mvh
Avatar billede starf Nybegynder
06. oktober 2011 - 14:15 #21
Så du mener hvis jeg ændre if til en when, så vil det kunne løse det? hen af

when (DateTime.Now <= kalenderdata.Date)
{
minstreng.Append(string.Format("{0} - {1} - Slut Tid: {2} Min.", kalenderdata.Date, kalenderdata.Name, kalenderdata.Date.AddMinutes(kalenderdata.Varighed).ToShortTimeString()));
minstreng.Append(System.Environment.NewLine);

?

det jeg enlig forsøger at opnå er noget med jeg har møde tid, og møde varrighed, på den måde kan jeg regne ud hvornår det slutter, jeg vil enlig bare have den til at skrive når der er møde, hvis det giver mening?
Avatar billede Syska Mester
06. oktober 2011 - 15:53 #22
foreach (var kalenderdata in strongTypedLines.When(x => x.SomeProp == SomeCondition).OrderBy(item => item.Date).Take(100))

Jeg ved ikke hvad du vil bruge din "Take" til.

Men mligheder er jo uendelige.

mvh
Avatar billede starf Nybegynder
06. oktober 2011 - 15:58 #23
det er jo også det jeg har prøvet?

med denne kode?

foreach (var kalenderdata in strongTypedLines.OrderBy(item => item.Date).Take(100))

den giver bare ikke noget data.
Avatar billede Syska Mester
06. oktober 2011 - 16:10 #24
Hvad giver:
strongTypedLines.OrderBy(item => item.Date).Take(100).Count()

OrderBy giver dig jo alle de ældste først ...
Avatar billede starf Nybegynder
06. oktober 2011 - 17:47 #25
så får jeg følgende fejl på den linie:

Error    1    foreach statement cannot operate on variables of type 'int' because 'int' does not contain a public definition for 'GetEnumerator'    W:\Script sjov\Møde sjov\Møde sjov\meeting\Form1.cs    121    13    meeting
Avatar billede Syska Mester
07. oktober 2011 - 02:04 #26
Det var heller ikke meningen du skulle bruge den i en foreach, men sætte et break point, og se hvad værdien af den var.

Du siger jo den ikke indeholder noget, men det tvivler jeg stærkt på. Jeg tror du ikke helt forstår din egen kode.

Hvis du har mange datoer ... og kun tager 100 poster, og de allesammen er fra fortiden, så vil din foreach jo aldrig virke, da den altid kommer ind i den tomme block. Da du netop sortere efter ældre post først ... og derefter tager 100.

mvh
Avatar billede starf Nybegynder
07. oktober 2011 - 08:49 #27
hmm kan godt se hvad du mener,

nu har jeg lige tjekket igen med et breakpoint, og "lines" indeholder alle linierne, strongtypelines lige så. minstreng er tom.

men hvis jeg kun vil have dne første linie efter jeg har sorteret på dato hvordan vil du så gøre det? Der må da være en måde at den kun skal skrive et resultat i:

if (DateTime.Now <= kalenderdata.Date)
{
minstreng.Append(string.Format("{0} - {1} - Slut Tid: {2} Min.", kalenderdata.Date, kalenderdata.Name, kalenderdata.Date.AddMinutes(kalenderdata.Varighed).ToShortTimeString()));
minstreng.Append(System.Environment.NewLine);

                 
}

der ud over, er det muligt at lave en if sætning eller sådan, der regegere hvis tiden er imellem 2 tidspunkter?
Avatar billede Syska Mester
07. oktober 2011 - 11:16 #28
lines.Where(a => a.kalenderdata.Date >= DateTime.Now).OrderByDecending(a => a.kalenderdata).FirstOrDefault()

Giver dig nyeste

lines.Where(a => a.kalenderdata.Date >= DateTime.Now).OrderByDecending(a => a.kalenderdata).Take(10)

10 Nyeste.

Grunden til FirstOrDefault() er at det så dermed ikke er en liste med 1 item, men bare et enkelt element.

mvh
Avatar billede starf Nybegynder
07. oktober 2011 - 11:37 #29
perfekt takker :)
Avatar billede starf Nybegynder
07. oktober 2011 - 12:14 #30
i må gerne smide et svar :)

btw

string endtime = null;

endtime = kalenderdata.Date.AddMinutes(kalenderdata.Varighed).ToString();

if (DateTime.Now => kalenderdata.Date && DateTime.Now <= endtime)

dette giver problemer åbenbart, går ud fra der er bedre måde at gemme dato som en varriable end string/var ?

på den kode der giver sidste linie problemer.
Error    3    Operator '<=' cannot be applied to operands of type 'System.DateTime' and 'string'
Avatar billede Syska Mester
07. oktober 2011 - 13:57 #31
Siger fejlen ikke sig selv.

Du kan jo heller ikke sammenligne USD & DKR uden at kende kursen for de to.

Her ved den jo ikke hvordan den skal behandle din string for at lave til en dato eller hvordan den skal lave din dato til en string. Du kan eventuelt overload <= operator.

Jeg ville nok tage og convert din string til en DateTime.

mvh og svar.
Avatar billede starf Nybegynder
07. oktober 2011 - 14:32 #32
jo den gjorde den.. løste det ved at sige datetime string.. :) tak for tålmodigheden.
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