Gå til innhold

konvertere string til dato objekt [LØST]


Anbefalte innlegg

Jeg holder på med et prosjekt der jeg skal hente ut registrerings datoer fra databasen, og sjekke om disse er før 1 november dette året. Før jeg legger inn dato i databasen er det datoene av typen dato objekt, men i databasen er det lagt som en tekst, siden det blir feil format dersom feltet er satt som dato. Når jeg henter ut datoen fra databasen blir det hentet ut som et string object, men for å få sammenlignet datoene, må jeg konvertere dette til et dato objekt.

 

For å gjøre dette har jeg brukt denne koden:

       Dim m As Medlem
       Dim dato As New Date
       Dim d As String 

      'går gjennom alle datoer i listen 
       While liste.Count > i
           m = liste.Item(i)
           d = m.innmeldtDato

           dato = Date.ParseExact(d, "d/M/yyyy", Nothing)

           If dato > grense Then
               'dersom dato er etter 1 november dette år, blir de fjernet fra listen.
               liste.RemoveAt(i)
           Else
               i = i + 1
           End If
end while

 

når jeg gjør dette får jeg en feilmelding:

System.FormatException: String was not recognized as a valid DateTime.

 

denne bugger på den linjen der jeg konverterer ( date.parse...)

 

når jeg i stedenfor å sette d = m.innmeldtDato, setter d = "11/2/2006" får jeg ikke feilmelding.

 

Jeg har sjekket formatet på datoen i databasen og alt jeg henter ut er i samme format som dette : "11/2/2006"

 

jeg har til og med testet ut med å sette datoene i databasen til denne datoen, men selv om det er akkurat samme verdiene så liker den ikke når jeg bruker den fra databasen.

 

Noen som har peiling på hva som kan være gale?

 

(jeg bruker .net 2.0 og visual studio 2005)

Endret av ing
Lenke til kommentar
Videoannonse
Annonse

Datoformat som skrives slik:

01/01/2005 mener jeg er et engelsk format. dvs

MM/dd/yyyy (måned først, så dag, så år)

 

På norsk skriver vi

dd.MM.yyyy

 

Kan det være derfor du får feilmelding? tall over 12 som måned vil ihvertfall feile.

 

Ellers bør du ta en nøye titt på dataene du får tilbake. Bruk breakpoints og sammenlikne en variabel med din manuelle test verdi og den verdien som kommer fra DB.

Lenke til kommentar
Datoformat som skrives slik:

01/01/2005 mener jeg er et engelsk format. dvs

MM/dd/yyyy  (måned først, så dag, så år)

 

På norsk skriver vi

dd.MM.yyyy

 

Kan det være derfor du får feilmelding? tall over 12 som måned vil ihvertfall feile.

 

Ellers bør du ta en nøye titt på dataene du får tilbake. Bruk breakpoints og sammenlikne en variabel med din manuelle test verdi og den verdien som kommer fra DB.

5946000[/snapback]

 

Jeg har lagt inn datoer slik at det ikke skal ha noe å si om det er engelsk eller norsk dato. jeg bruker datoen "11/2/2006" og den skulle vel funke både på engelsk format og norsk?

 

Jeg testet likevel med å forandre på formatstringen ("d/M/yyyy" til "M/d/yyyy"), men dette gjorde ingen forskjell.

 

Det som er merkeli er at koden funker når jeg hardkoder stringen jeg sender inn til denne datoen, men når jeg henter ut samme datoen fra databasen så funker det ikke. Får også forskjellige feilmeldinger avhengig av om jeg kjører lokalt eller på serveren.

 

lokal feilmelding:String was not recognized as a valid DateTime.

server feilmelding: System.FormatException: The DateTime represented by the string is not supported in calendar System.Globalization.GregorianCalendar.

 

har ikke så mye erfaring med dette så vet ikke helt hvor jeg skal begynne å lete etter feil.

 

Jeg har brukt breakpoints og sjekket at den datoen som jeg henter ut fra databasen faktisk er helt identisk med den jeg hardkoder inn.

Endret av ing
Lenke til kommentar

Hvis du henter ut fra databasen kan du prøve denne:

 

dim DBDato as System.Data.SqlTypes.SqlDateTime = CType(fradatabasedato, System.Data.SqlTypes.SqlDateTime)

dim MinDato as DateTime = DBDato.Value

 

 

Er ikke sikker på om den virker med OleDB, men er vel verdt et forsøk :)

Lenke til kommentar

Noe er tydeligvis forskjellig. Det var derfor jeg sa du skulle studere variablene nøye med Watch.

 

Kanskje en space for mye?

 

Prøv:

Dim d as String
d = m.innmeldtDato.ToString() ' For sikkerhetskyld kjør ToString()
d = d.Trim(); ' Trim den for evt fjerne ekstra spaces
Debug.WriteLine(">" & d & "<"); 'bare for å se
dato = Date.ParseExact(d, "d/M/yyyy", Nothing)

 

Har du prøvd bare enkel DateTime.Parse(d) ?

Lenke til kommentar

prøvde de to siste forslagene deres, men dette ser ikke ut til å funke.

 

Kanskje jeg skulle ha prøvd å sette datoformat i databasen? ser der er flere typer å velge mellom (date, datetime, timestamp, time). Hvilke av disse burde jeg bruke for å få ønsket format?

Lenke til kommentar

glømte å prøve date.parse, og dette funket :)

 

det som er problemet nå er at datoen blir norsk, mens den jeg sammenligner med er engelsk. Hvordan skifter jeg til norsk format når jeg lager et date object?

Lenke til kommentar

Siden jeg begynte med C# har jeg kun forholdt meg til DateTime objekt. Mulig VB.NET har en bakoverkompabil Date objekt, men vet lite om den.

 

Så lenge du konverterer begge de datoene du skal sjekke til Date/DateTime så skal sjekken fungere fint. Date/DateTime er verken norsk/engelsk, kun en dato.

Dim dato1 as Date = Date.Parse(dato1string)
Dim dato2 as Date = Date.Parse(dato2string)
if dato1>dato2 then ...

Lenke til kommentar

Prøvde med å konvertere både dato objektet og stringen, men de ble fortsatt forskjellige

 

'hente ut verdiene

provider = New System.Globalization.CultureInfo("nb-NO", True)

 

d = m.innmeldtDato.ToString() '= "11/2/2006"

Dim grense As New Date(Date.Today.Year, 11, 1) '="11/1/2006"

 

'konvertering

g = DateTime.Parse(grense, provider) '="11/1/2006"

dato = DateTime.Parse(d, provider) '="2/11/2006"

 

når de blir så forskjellige, går det ikke an å sammenligne uten å få feil resultat :hmm:

Lenke til kommentar

Kjapt tips der.

Når datostrenger inneholder tegnet '/' så klarer ikke .Net alltid å forstå om det er d/M/yyyy eller M/d/yyyy.

 

Så ta

datostrengen.Replace("/", ".")

før du parser den.

d.M.yyyy kan kun tolkes slik. Har aldri sett M.d.yyyy.

Lenke til kommentar

kan jeg da sammenligne en dato av formatet 11/2/2006 med en dato av formatet 11.2.2006 og forvente riktig resultat?

 

Prøvde den koden du ga meg, men den vil ikke bytte ut / med .

 

Vil gjerne at koden skal fungere med engelsk datoformat, da det er dette som blir lagt inn i databasen. Jeg får feilmelding når jeg prøver å omformatere en dato som er 10/29/2006. Dette fordi omformingskoden antar at dager er mnd og omvendt.

 

Noen som vet om det går an å sette hvordan datoen skal vises noen steder?

Endret av ing
Lenke til kommentar

joda, jeg kan jo alltids sette provideren til engelsk format :blush:

 

er ikke alltid like lett å oppdate slike feil. Men det er godt når de endelig er oppklart. Koden funker nå fint =)

 

 

Tusen takk for hjelpen =)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...