Avatar billede jriff Nybegynder
18. september 2005 - 13:15 Der er 5 kommentarer

DateTime og Globalization

Hej Alle!

Jeg er løbet lidt sur i dato og tid i .net:

Lokalt på min udviklingsmaskine kører jeg selvfølgelig dansk - det er fint, for når jeg hiver en dato ud af min database vil det være den danske notation (dd-mm-åå) og når jeg skal gemme en dato gælger den danske notation også.

Når jeg uploader min løsning til serveren kan jeg dog se at den er sat op til US-notation (mm-dd-åå), og det er jo et problem. Jeg har lavet et workaround:

Ved læsning fra DB:
DateTime d=DateTime.Parse(ds.Tables[0].Rows[t]["Dato"].ToString());
CultureInfo ci=new CultureInfo("da-DK");           
String dato=d.ToString("d",ci);

Ved skrivning til DB:
//Læs dato fra textbox
CultureInfo ci=new CultureInfo("da-DK");
DateTime d=DateTime.Parse(tbxDato.Text,ci);

//Skriv til DB med US-notation
CultureInfo ci2=new CultureInfo("en-US");
String dato=d.ToString("d",ci2);



Det virker også fint, men selvfølgelig på serveren - prøver jeg lokalt virker det ikke. Jeg sidder tilbage med to spørgsmål:

1) Er det sådan "man" gør, eller findes der en smartere måde?
2) Hvordan kommer man udover problemmet med at det kun virker enten lokalt eller på serveren? (Udover at skrive det i web.config og så lave if-sætninger).

- Jacob
Avatar billede erikjacobsen Ekspert
18. september 2005 - 15:03 #1
Jeg plejer at få det til at virke med:

1) Altid 2005-09-18 når det skal i databasen
2) Og altid få dag, måned, år ud af datoen med de indbyggede funktioner, der giver dag, måned og år. ToString og lignende kan man jo netop ikke regne med, men i nogle situationer kan man bruge dem til simpel visning.
Avatar billede arne_v Ekspert
18. september 2005 - 22:15 #2
et ord: parameters
Avatar billede arne_v Ekspert
18. september 2005 - 22:16 #3
hvis du bruger parameters så har du ikke noget problem med databasen

og i bruger interfacet kan du så vælge om du vil bruge fast explicit
culture eller lade server setting bestemme
Avatar billede arne_v Ekspert
18. september 2005 - 22:27 #4
eksempel som jeg har postet en halv snes gange:

using System;
using System.Threading;
using System.Data.OleDb;

class MainClass
{
    public static void Main(string[] args)
    {
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb");
        con.Open();
        OleDbCommand cre = new OleDbCommand("CREATE TABLE dtest (i INTEGER PRIMARY KEY, d DATETIME)", con);
        cre.ExecuteNonQuery();
        OleDbCommand ins = new OleDbCommand("INSERT INTO dtest VALUES (?, ?)", con);
        ins.Parameters.Add("@i", OleDbType.Integer);
        ins.Parameters.Add("@d", OleDbType.Date);
        for(int i = 0; i < 10; i++)
        {
            ins.Parameters["@i"].Value = i;
            ins.Parameters["@d"].Value = DateTime.Now;
            ins.ExecuteNonQuery();
            Thread.Sleep(1000);
        }
        Console.WriteLine("All rows :");
        OleDbCommand sel = new OleDbCommand("SELECT * FROM dtest", con);
        OleDbDataReader rdr = sel.ExecuteReader();
        while(rdr.Read())
        {
            int i = (int)rdr[0];
            DateTime d = (DateTime)rdr[1];
            Console.WriteLine(i + " " + d);
        }
        rdr.Close();
        Console.WriteLine("Rows last 5 seconds since " + DateTime.Now + " :");
        OleDbCommand sel2 = new OleDbCommand("SELECT * FROM dtest WHERE d > ?", con);
        sel2.Parameters.Add("@d", OleDbType.Date);
        sel2.Parameters["@d"].Value = DateTime.Now.AddSeconds(-5);
        OleDbDataReader rdr2 = sel2.ExecuteReader();
        while(rdr2.Read())
        {
            int i = (int)rdr2[0];
            DateTime d = (DateTime)rdr2[1];
            Console.WriteLine(i + " " + d);
        }
        rdr2.Close();
        OleDbCommand drp = new OleDbCommand("DROP TABLE dtest", con);
        drp.ExecuteNonQuery();
        con.Close();
    }
}
Avatar billede arne_v Ekspert
04. november 2005 - 20:22 #5
kommet videre ?
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