Avatar billede stig-b Nybegynder
17. juli 2006 - 17:05 Der er 11 kommentarer og
1 løsning

Konvertering af DateTime.DayOfWeek til int32 vha IFormatProvider

Er der mon en ekspert, der ved hvordan jeg bruger IFormatProvider, når jeg skal konvertere en DateTime.DayOfWeek til int32?

Selve koden har jeg intet problem med, men brugen af IFormatProvider i forskellige sammenhænge forekommer mig kryptisk.

Problemet er følgende: Jeg har en dato streng "01-Jan-06" som jeg konverterer til DateTime: dtDato = DateTime.Parse(dato);
Nu vil jeg så gerne have ugedagen. Ingen problemer hvis jeg bruger dayOfWeek = Convert.ToInt32(dtDato.DayOfWeek);

Men kører jeg FXCop op imod biblioteket hvori denne kode findes brokker den sig over, at jeg ikke bruger IFormatProvider.

Et meget enkelt eksempel ville være dejligt. MSDN eksemplerne tager pusten fra mig :)

På forhånd tak
stig-b
Avatar billede md_craig Nybegynder
17. juli 2006 - 17:46 #1
Sagen er nok at dayofweek jo er forskelligt i forhold til land... dvs
derfor bliver den forskelligt hvad du får ud af det...

nogle steder ses søndag som den første dag i ugen og andre steder mandag...
du kan bruge cultureinfo til det:

            CultureInfo dk = CultureInfo.GetCultureInfo("da-DK");

            DateTime dtDato = DateTime.Parse("17-Juli-06", dk);
            int dayOfWeek = Convert.ToInt32(dtDato.DayOfWeek, dk);
Avatar billede dj_uncas Nybegynder
17. juli 2006 - 18:40 #2
Du kan også bare gøre:

int dayOfWeek = Convert.ToIn32( dtDato.DayOfWeek, CultureInfo.CurrentCulture );

Det du skal finde er bare en eller anden implementering af IFormatProvider interfacet, og dem er der flere af, bl.a. CultureInfo
Avatar billede stig-b Nybegynder
18. juli 2006 - 00:26 #3
Tak skal I have, begge to. Hvad gør vi nu? Jeg kan bruge begge løsninger i forskellige sammenhænge. Hvad siger I til at dele point? Hvis det er OK med jer at dele, send mig et svar hver. Ellers kom med et andet forslag. Og endnu en gang tak.

Og noget helt andet, er der nogen af jer der ved, hvor der findes f.eks. tutorials eller forståelige eksempler på strong naming of assemblies? Eller er det bedst at oprette et nyt spm.?

stig-b
Avatar billede arne_v Ekspert
18. juli 2006 - 01:28 #4
hvad udskriver nedenstående program hos jer:

using System;
using System.Globalization;

namespace E
{
    public class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine((int)DateTime.Now.DayOfWeek);
            Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek));
            Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek, new CultureInfo("da-DK")));
            Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek, new CultureInfo("en-US")));
            Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek, null));
        }
    }
}
Avatar billede stig-b Nybegynder
18. juli 2006 - 02:33 #5
Tak for inputtet. 2 i alle tilfælde. Tilsyneladende er der ingen forskel på ugedagens numre, uanset hvordan CultureInfo er sat, og tilsyneladende har new CultureInfo("da-DK") eller CultureInfo("en-US") ingen indflydelse på output. På mit engelske system er dato output også ens i begge tilfælde: 18-Jul-06 02:15:54

Hvis jeg nu bruger
using System.Threading;

og gør følgende:

CultureInfo ci = CultureInfo.CurrentCulture; // fanger min nuværende CultureInfo
Thread.CurrentThread.CultureInfo = new CultureInfo("da-DK"); // skifter til dansk
Console.WriteLine(DateTime.Now.ToString());
Output: 18-07-2006 02:15:54
Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek));
Output: 2

Thread.CurrentThread.CultureInfo = ci; // sætter tilbage til engelsk
Console.WriteLine(DateTime.Now.ToString());
Output: 18-Jul-06 02:15:54
Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek));
Output: 2

Endnu en gang tak for inputtet. Godt med én til tænkeren :)

stig-b
Avatar billede stig-b Nybegynder
18. juli 2006 - 02:47 #6
Mit oprindelige spørgsmål gik på brugen af IFormatProvider og FXCop's brokken sig over min mangelende brug af provideren, og den er tilfreds med

Convert.ToInt32(DateTime.Now.DayOfWeek, CultureInfo.CurrentCulture);
eller
Convert.ToInt32(DateTime.Now.DayOfWeek, new CultureInfo("en-US"));

så jeg regner med at de designmæssige best practises er dækket.

Dit meget anstændige input :) åbnede dog øjnene for hvordan datoer til og fra databaser kan håndteres uanset hvilken kulturinfo der er til stede på brugerens system. Stor tak!
Avatar billede stig-b Nybegynder
18. juli 2006 - 03:05 #7
Sorry for kommentarerne til koden :*
Avatar billede dj_uncas Nybegynder
18. juli 2006 - 10:27 #8
Så vil jeg tillade mig at ligge et svar.
Avatar billede stig-b Nybegynder
18. juli 2006 - 11:02 #9
Tak for dit svar dj_uncas. Æhrm, hvordan er det nu lige, at man deler pointene imellem 2 personer?
Avatar billede stig-b Nybegynder
18. juli 2006 - 11:24 #10
Ups, det var ikke meningen. Pointene skulle have været delt, så der var 30 til dig og 30 til md_craig. Er der en mulighed for at lave dette om. Hvis ikke kan jeg så oprette et nyt spm., som md_craig kan svare på..? Jeg er ret rusten her.
Avatar billede dj_uncas Nybegynder
18. juli 2006 - 12:00 #11
Jeg har oprettet et spørgsmål her:
http://www.eksperten.dk/spm/721176

hvor md_craig skal svare. Så får han 30 point og jeg får 30 point :-)
Avatar billede stig-b Nybegynder
18. juli 2006 - 12:27 #12
Kanon. Tak for hjælpen. Jeg lærer det nok :)
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