Gå til innhold

Hjelp til datoformattering i VB6


Anbefalte innlegg

Skrevet

Noen tips på hvordan jeg skal klare å formattere dato til dette formatet DDMMYYYY når man ikke helt vet hvilken datoformat man får inn?

 

Dvs

1/2/2006

01.2.2006

1-2-06

01-2-2006

1.02.06

01.02.2006

1.2.2006

1.2.6

osv

Videoannonse
Annonse
Skrevet

Kan det være fordi datoen er skrevet med MMDDYY? Og hvorfor kan du ikke la det være kun et datoformat?

 

Dersom dette er inndata fra brukeren, kan du kanskje bruke IsDate() for å sjekke om datostrengen er korrekt.

Skrevet

Fordi det er en analysekomponent til ett OCR program.Og du aner ikke hvor mange måter man kan skrive/tolke en dato.

 

Men tror jeg klarte å lage noe til slutt som fungerer tilfredstillende.

Skrevet

ka du ikke ta ett og ett tall, og legge dem sammen?

 

stort sett er det 2 tegn i en dato som ikke er et tall, eventuelt 1, viss de har utelatt arstallet

 

forst kan du kjore en loop pa antall tegn som ikke er ett tall, og sa trekke fra de to faregande tallene

 

PseudoCode:

Dim lDay as long, lMonth as long, lYear as long
scur = mid(strDato,1,1)
'finn dag...
Dim lCur as long
for lCur = 1 to len(strDato)
  If mid(strData,Lcur,1) <> ettNummer then
       lDay = left(strDato, lcur - 1)
       strDato = mid(strDato, lcur + 1)
       exit for
next lCur
'Finn Maaned...
for lCur = 1 to len(strDato)
  If mid(strData,Lcur,1)<> ettNummer then
       lMonth = left(strDato, lcur - 1)
       strDato = mid(strDato, lcur + 1)
       exit for
next lCur
if len(strDato) > 0 then
   lyear = strDato
end if

kan sikkert forbedres litt

Skrevet

Sub test()

MsgBox DateValue("1/2/2006")

MsgBox DateValue("01.2.2006")

MsgBox DateValue("1-2-06")

MsgBox DateValue("01-2-2006")

MsgBox DateValue("1.02.06")

MsgBox DateValue("01.02.2006")

MsgBox DateValue("1.2.2006")

MsgBox DateValue("1.2.6")

End Sub

 

Det denne ikke håndterer er rene tall som 0102 , 010206 eller 01022006. Det er ikke så vrient å skrive kode for sånt.

 

HTH. Beste hilsen Harald

  • 2 uker senere...
Skrevet (endret)

du lager deg unødvendige problemer

det er bare en dato

dessuten er det umulig å forutsi alle typer datoer,

siden du mest sannsynlig jobber med menneskelig input

hvorfor prøve engang...(?)

 

CDate tar de fleste

Endret av MadGonzo
Skrevet (endret)

En dato er ikke bare en dato.

 

Jobber ikke med menneskelig input, men OCR av menneskelig/data output.

 

Og CDate tok ikke de fleste, derfor måtte jeg bygge opp min egen analysekomponent. Og det ser ut som den virker.

Endret av stoners
  • 2 uker senere...
Skrevet
En dato er ikke bare en dato.

 

Jobber ikke med menneskelig input, men OCR av menneskelig/data output.

 

Og CDate tok ikke de fleste, derfor måtte jeg bygge opp min egen analysekomponent. Og det ser ut som den virker.

6244799[/snapback]

 

Moro når en da kommer over brukere som ikke har norsk datoformatering i oppsettet på maskinen sin. Har slitt så sinnsykt med å takle både norsk og amerikansk dato...

 

01/05/06

 

Om dette er 1. mai eller 5. januar kommer helt an på hvordan brukeren har satt opp maskinen.... (Hvertfall med CDate funksjonen)

Skrevet (endret)

Heldigvis er datooppsettet relativt like på alle pc'ene der denne komponenten skal kjøre.. (tror jeg )

Endret av stoners
Skrevet
Prøvde du noengang DateValue som jeg viste deg ? Den håndterer d/m/å - m/d/å -oppsettet uten problemer og forøvrig alle eksemplene dine.

 

Beste hilsen Harald

6320565[/snapback]

 

Du har ikke en link til meg også på det der?

Skrevet (endret)

Det står lenger opp i tråden, fra 26.5. Kanskje dere ser noe annet enn jeg gjør. Men her er en enda tydeligere demo:

 

Sub test()

Dim D As Date

Dim S As String

 

S = "1/2/2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1-2 2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1/2-06"

D = DateValue(S)

MsgBox D, , S

 

S = "01.2.2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1-2-06"

D = DateValue(S)

MsgBox D, , S

 

S = "01-2-2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1.02.06"

D = DateValue(S)

MsgBox D, , S

 

S = "01.02.2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1.2.2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1.2.6"

D = DateValue(S)

MsgBox D, , S

 

S = "1/2"

D = DateValue(S)

MsgBox D, , S

 

S = "Feb 01"

D = DateValue(S)

MsgBox D, , S

 

S = "1.feb"

D = DateValue(S)

MsgBox D, , S

 

S = "1 feb 06"

D = DateValue(S)

MsgBox D, , S

 

S = "1 Februar"

D = DateValue(S)

MsgBox D, , S

End Sub

 

Datevalue håndterer ikke rene tall som 0102 , 010206 eller 01022006. Det er ikke så vrient å skrive kode for sånt.

 

PS. Pussig nok kommer jeg over en søt artikkel om disse tings tilblivelse bare minutter etter at jeg har sendt dette. Her:

http://www.joelonsoftware.com/items/2006/06/16.html

 

HTH. Beste hilsen Harald

Endret av Harald Staff
Skrevet (endret)

Hmm,

 

Denne fungerer helt til du setter standards and formats til English U.S.

da gjør den akkurat de samme feilene, ettersom den da tror 01/02/06 er 2 januar.

 

Som en kan se slik:

 

S = "1/2/2006"

D = DateValue(S)

MsgBox "day: " & Day(D) & " month: " & Month(D) & " year: " & Year(D), , S

 

Altså om en nordmann har satt op maskinen sin feil, vil feil inntreffe.

 

I tillegg klarte ikke denne rutinen å håndtere datoer med . om maskinen er satt opp med engelske datoformater.

 

Har fått en beskrivelse av en funksjon her: https://www.diskusjon.no/index.php?showtopic=571460

 

som kanskje fungerer bra. Har ikke fått testet den ennå...

 

edit: Testet nå og den virker bulletproof! Byttet mellom de forskjellige datoformatene og den kommer ut med rett dato uansett. Hvorfor testet jeg ikke denne tidligere?!

Endret av [space]
Skrevet (endret)

Det er jo ikke sånn. I USA og på en US-engelsk oppsatt maskin vil strengen

S = "1/2/2006"

bety nettopp 2. januar. Og et lands maskiner vil ikke behøve å forholde seg til datoinnskrivninger eller datofelter inneholdende lokalt ugyldige datoformater.

 

Jeg ser i den andre tråden at du skal lage en multi-language versjon. Om du skal selge et program til US-oppsatte maskiner og der påstår at "1/2/2006" er i februar, da blir du neppe rikere enn Røkke. Du er nødt til å gjøre det på min måte dersom datoinnskrivning skal fungere i mange land med hvert lands logikk, det er hele ideen med pc'ens regionale innstillinger. Omvandle strengen til en datovariabel med DateValue, og så lagrer du datovariabelen i Accessbasen, det virker i alle land og du trenger ikke tenke mer på hvordan datoer skrives inn eller hvordan den lokale Access viser resultatene. Du har ekte, entydige, riktige datoer.

 

Det du beskriver som problematisk oppstår først når du begynner å sende datoer som tekststrenger over landegrenser med forskjellige formater "for å konvertere dem i utlandet". Men den ideen er ikke helt god i utgangspunktet ;)

 

HTH. Beste hilsen Harald

Endret av Harald Staff
Skrevet

Problemet er at jeg har hatt en del problemer med folk som får invalid date pga feil oppsett på maskinen. Dette er vel da typisk folk med piratkopiert windows, som ikke har giddet fikse på det under installasjonen.

 

I engelskspråklige land vil man vel ikke oppleve dette problemet da engelsk jo er standardinstillingen.

Skrevet

Da er det vel egentlig helst de som burde fikse problematikken på sin datamaskin, og ikke du i ditt program. Koden jeg gav deg i den andre tråden fungerer, som jeg nevnte, kun for DDMMYY og DDMMYYYY (da kan du ikke skrive 122006 og tro at du får 1.02.2006), eller D[ikke-tall]M[ikke-tall]Y[ikke-tall], der [ikke-tall] representerer en streng med karakterer som ikke er et tall (eksempelvis punktum eller skråstrek).

 

Når oppstår denne feilen for øvrig? Når de taster inn en dato, eller når de eksekverer programmet/modulen?

Skrevet
I engelskspråklige land vil man vel ikke oppleve dette problemet da engelsk jo er standardinstillingen.

6325141[/snapback]

Dette har du ikke skjønt, og jeg gir opp å hjelpe deg med følgende:

Hvis programmet ditt får inndata "1/2/2006" så må programmet vite om det med det menes 2. januar eller 1. februar. Det er bare tre måter å avgjøre det, og du kan bare bruke en av dem:

- bestemme at det alltid menes 2.januar;

- bestemme at det alltid menes 1.februar;

- sjekke om maskinen er satt opp med måned eller dag som første ledd i datoer.

 

Det er ellers rørende av deg å legge så mye jobb i å bistå late tyver og pirater. Jeg hadde nok ikke vært grei.

 

Beste hilsen Harald

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...