Kirjautuminen

Haku

Tehtävät

Opasarkisto: Visual Basic: Päivämäärien käsittely

Kirjoittaja: Antti Laaksonen (2002).

⚠ Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi. ⚠


Visual Basicissa on päivämäärille oma sisäänrakennettu datatyyppi, Date. Päivämäärät voivat olla väliltä 1. tammikuuta 100 ja 31. joulukuuta 9999 - eli varsin riittävältä asteikolta. Date-tyyppiä käyttämällä mistä tahansa päivämäärästä saa vakiotietojen ohella mm. viikonpäivän, vuodenpäivän ja viikon numeron, joten valmiit funktiot riittävät varsin moneen tarkoitukseen.

Kalenterin valitseminen

Käytettävä kalenteri valitaan asettamalla Calendar-muuttujan arvoksi joko vbCalGreg (oletus) tai vbCalHijri. Oletusarvo vbCalGreg tarkoittaa meille tuttua gregoriaanista kalenteria, ja vbCalHijri ottaa käyttöön islamilaisen kalenterin. Kalenteri valitaan esimerkiksi näin:

Calendar = vbCalGreg

Päivämäärän määrittäminen

Päivämäärät ovat siis muuttujia Date-tyypillä. Muuttujille voi asettaa päivämäärän toisesta muuttujasta, merkkijonolla tai DateSerial- ja TimeSerial -funktioilla. Lisäksi erikoismuuttuja Now sisältää aina koneen nykyisen ajan.

Dim nyt As Date, joulu As Date, y2k As Date
nyt = Now
joulu = "24.12.2002"
'joulu = "24/12/02"
y2k = DateSerial(2000, 1, 1)

Jos päivämäärän ilmoittaa merkkijonolla, sen voi huoletta ilmoittaa myös suomalaisessa muodossa pp.kk.vvvv, tietenkin perinteinen pp/kk/vv on myös mahdollinen tapa. DateSerial-funktio ottaa parametreikseen vuoden, kuukauden ja päivän.

Päivämäärissä on myös aina mukana kellonaika, minkä määrittäminen tapahtuu lisäämällä merkkijonoon aika tai käyttämällä TimeSerial-funktiota. DateSerial ja TimeSerial voidaan myös yhdistää. Now sisältää kellonajan automaattisesti.

Dim keskip As Date, keskiyo As Date, y2ka As Date
keskip = "12:00:00"
keskiyo = TimeSerial(0, 0, 0)
y2ka = DateSerial(1999, 12, 31) + TimeSerial(23, 59, 59)

Funktiot DateValue ja TimeValue muodostavat myös päivämäärän merkkijonosta, mutta tavallisesti merkkijonon voi laittaa pelkkänäänkin Date-muuttujaan.

Päivämäärän muotoilu Formatilla

Format-funktio on paras tapa muotoilla Date-muuttujassa olevasta päivämäärästä halutunlainen. Funktion ensimmäinen parametri on päivämäärämuuttuja, jonka jälkeen tulee joku seuraavista muotoilumerkkijonoista tai niiden yhdistelmä. Taulukossa esimerkkipäivä on huhtikuun 5. vuonna 2002 ja kellonaika on 9:05:02. (*):llä merkityt kohdat riippuvat Windowsin maa-asetuksista, tässä taulukossa muoto on suomenkielinen.

muotoilupalauttaaesimerkki
ctäydellinen päivämäärä ja aika (*)5.4.2002 9:05:20
dkuukauden päivän lyhyt muoto5
ddkuukauden päivän pitkä muoto05
dddviikonpäivän lyhyt muoto (*)pe
ddddviikonpäivän pitkä muoto (*)perjantai
dddddpäivämäärän lyhyt muoto (*)5.4.2002
ddddddpäivämäärän pitkä muoto (*)5. huhtikuuta 2002
htunnin lyhyt muoto9
hhtunnin pitkä muoto09
mkuukauden lyhyt muoto4
mmkuukauden pitkä muoto04
mmmkuukauden nimen lyhyt muoto (*)huhti
mmmmkuukauden nimen pitkä muoto (*)huhtikuu
nminuutin lyhyt muoto5
nnminuutin pitkä muoto05
qvuosineljännes2
ssekunnin lyhyt muoto2
sssekunnin pitkä muoto02
ttttttäydellinen aika (*)9:05:02
wviikonpäivän numero (*)5
wwviikon numero14
yvuodenpäivä95
yyvuoden lyhyt muoto02
yyyyvuoden pitkä muoto2002

Format-funktion kolmas valinnainen parametri on ensimmäisen viikonpäivän määritys, joka on usein hyvä laittaakin, sillä amerikassa sunnuntai on viikon ensimmäinen päivä maanantain sijaan. Parametri voi olla jokin seuraavista vakioista tai luvuista:

vakiolukuensimmäinen viikonpäivä
vbUseSystem0Windowsin maa-asetuksen mukainen
vbSunday1sunnuntai (oletus)
vbMonday2maanantai
vbTuesday3tiistai
vbWednesday4keskiviikko
vbThursday5torstai
vbFriday6perjantai
vbSaturday7lauantai

Neljäskin vapaaehtoinen parametri on olemassa, vuoden ensimmäisen viikon määrittäminen. Sen vaihtoehdot ovat:

vakiolukuensimmäinen viikko
vbUseSystem0Windowsin maa-asetuksen mukainen
vbFirstJan11viikko, jona on tammikuun ensimmäinen päivä
vbFirstFourDays2viikko, jossa on vähintään neljä uuden vuoden päivää
vbFirstFullWeek3viikko, joka on kokonaan uuden vuoden puolella

Näin ollen funktion täydellinen syntaksi on:
Format(aika, muotoilu [, viikon ensimmäinen päivä [, vuoden ensimmäinen viikko]])

Seuraava esimerkki näyttää MsgBoxissa tietoa sen hetkisestä päivämäärästä, kellonajasta, ja vuodenpäivästä.

Dim nyt As Date
nyt = Now
MsgBox "Nyt on " & Format(nyt, "dddd", vbMonday) & ", " & Format(nyt, "ddddd") & " ja kello on " & Format(nyt, "ttttt") & ". On vuoden " & Format(nyt, "y") & ". päivä."

Muita tapoja päivämäärän muotoilemiseen

Päivämäärän ja ajan osien palauttamiselle on myös omat funktionsa. Jokainen funktio ottaa parametrikseen päivämäärämuuttujan ja palauttaa kokonaisluvun. Funktiot ovat Year, Month, Day, Hour, Minute, Second ja Weekday ja ne palauttavat samassa järjestyksessä vuoden, kuukauden, päivä, tunnin, minuutin, sekunnin ja viikonpäivän numeron.

DatePart-funktio palauttaa lisäksi kokonaislukuna jonkin aikayksikön päivämäärämuuttujasta. Mahdollisia aikayksiköitä ovat:

merkkiyksikkö
dpäivä
htunti
mkuukausi
nminuutti
qvuosineljännes
ssekunti
yvuodenpäivä
yyyyvuosi
wviikonpäivä
wwviikko

Seuraavassa on pari esimerkkiä edellämainittujen funktioiden käytöstä:

Dim pvm As Date
pvm = "20.03.2003 20:03"
MsgBox "Vuosi: " & Year(pvm)
MsgBox "Päivä: " & Day(pvm)
MsgBox "Minuutti: " & Minute(pvm)
MsgBox "Vuodenpäivä: " & DatePart("y", pvm)

Muut päivämääräfunktiot

VB sisältää edellämainittujen lisäksi ainakin kolme muuta päivämäärän liittyvää funktiota. Nämä funktiot ovat IsDate, DateAdd ja DateDiff.

IsDate-funktio palauttaa True, jos muuttuja on päivämääräksi kelpaava. Esimerkiksi:

If IsDate("29.11.2002") Then
    MsgBox "29.11.2002 on kelpaava aika"
Else
    MsgBox "29.11.2002 ei ole kelpaava aika"
End If

'2002 ei ole karkausvuosi
If IsDate("29.2.2002") Then
    MsgBox "29.2.2002 on kelpaava aika"
Else
    MsgBox "29.2.2002 ei ole kelpaava aika"
End If

DateAdd-funktio lisää päivämäärä muuttujaan tietyn verran aikayksikköjä edellisen luvun yksikkötaulukon mukaisesti. Esimerkki lisää päivämäärään 111 päivää:

Dim pvm As Date
pvm = "1.1.2002"
pvm = DateAdd("d", 111, pvm)
MsgBox "111 päivää 1.1.2002 jälkeen on " & Format(pvm, "c")

DateDiff-funktio palauttaa kahden päivämäärän välisen eron halutussa yksikössä, edellisen luvun yksikkötaulukon mukaan. Esimerkki laskee päivien 1.1.1900 ja 1.1.2000 eron kuukausissa:

Dim p1 As Date, p2 As Date, p3 As Integer
p1 = "1.1.1900"
p2 = "1.1.2000"
p3 = DateDiff("m", p1, p2)
MsgBox "Päivämäärien ero: " & p3 & " kuukautta"

Loppusanat

Oppaasta ei tullut järin pitkä, mutta yritin mahduttaa siihen mahdollisimman paljon asiaa. Joitakin VB:n päivämääräsysteemiin liittyviä asioita, kuten kolmea viimeistä funktiota, ei sen syvemmin käsitelty, mutta ongelmistahan voi aina kysyä keskustelualueella tai minulta sähköpostilla. Samaiseen sähköpostiosoitteeseen voi myös lähettää palautetta tästä oppaasta.

Kommentit

Computer [22.01.2006 09:56:10]

#

aika kätevää

hauki [30.01.2008 15:48:06]

#

onko sekunttien kymmenyksiin mitään vastaavaa?

JussiR [30.01.2008 21:32:09]

#

hauki kirjoitti:

onko sekunttien kymmenyksiin mitään vastaavaa?

Katso timegettime API:

black cat [07.01.2010 16:14:14]

#

hyvä päivämäärien käsittely opas

akru [13.01.2010 15:07:38]

#

Miten saa kun syöttää Esim. 24122009 niin järjestelmä asettaa sen 24.12.2009 muotoon?

Kirjoita kommentti

Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta