Kirjoittaja: sooda
Kirjoitettu: 28.06.2004 – 28.06.2004
Tagit: yhteiskunta, koodi näytille, vinkki
Laskee päivämäärän UNIX-aikaleimasta, GMT-ajassa, eli Suomen aika ei ole sama kuin se minkä tämä laskee, se pitää sitte ottaa huomioon...
Vormaatti on öbaut sama kuin PHP:n date-funkkarissa (https://www.php.net/manual/en/function.date.php), joitain mokomia turhakkeita(?) jätin pois, mutta on tässäki 20kpl.
Arvatkaa oliko tuskaa vääntää tätä =P Tiä sitten toimiiko edes oikein.
Function PuraLeima(Vormaatti, ByVal Leima)
'kertoimet kuntoon
minuuttikerroin& = 60
tuntikerroin& = 60 * minuuttikerroin
päiväkerroin& = 24 * tuntikerroin
vuosikerroin& = 365 * päiväkerroin
'laskeskeskeskeskellaan hullusti
Viikonpäivä = (Leima \ päiväkerroin) Mod 7
vuosi = Leima \ vuosikerroin
Leima = Leima Mod vuosikerroin
päivä = Leima \ päiväkerroin
Leima = Leima Mod päiväkerroin
tunti = Leima \ tuntikerroin
Leima = Leima Mod tuntikerroin
minuutti = Leima \ minuuttikerroin
Leima = Leima Mod minuuttikerroin
sekunti = Leima
vuosi = vuosi + 1970 'leima 0 on 1.1._1970_
kuukausi = 1 'leima 0 on 1._1_.1970
päivä = päivä + 1 'leima 0 on _1_.1.1970
'montako päivää kuukausissa
pvät = Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
'sunnuntai on ekana koska se päivä mistä leimoja lähettiin laskemaan oli sunnuntai.
pvä = Array("sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "pejantai", "lauantai")
kuu = Array("tammi", "helmi", "maalis", "huhti", "touko", "kesä", "heinä", "elo", "syys", "loka", "marras", "joulu")
'karkausvuodet menoon mukaan
For i = 1970 To vuosi - 1
If karkaa(i) Then päivä = päivä - 1: jutu = jutu + 1
Next
If päivä < 1 Then 'jos karkausvuosista tulee niin paljon että päivät menee yli niin korjataan
vuosi = vuosi - 1
If karkaa(vuosi) Then karkaako = 1
päivä = päivä + 365 + karkaako
End If
päivät = päivä 'vuodenpäiviä varten
'liialliset päivät kuukausiksi
If päivä > pvät(0) Then
Do While päivä > pvät(kuukausi - 1)
'siirrretään päivät kuukauteen
päivä = päivä - pvät(kuukausi - 1)
kuukausi = kuukausi + 1
If (kuukausi = 3) And karkaa(vuosi) Then 'karkausvuosissa on helmikuussa 29 päivää
päivä = päivä - 1
If päivä = 0 Then 'jos olisi ollut maaliskuun 1. niin onki helmikuun 29.
päivä = 29
kuukausi = 2
Exit Do 'mennään pois ettei jäisi ikuisesti junnaamaan koska
'...tuolla dowhile mestoilla luulisi että on 28 päivää vain vaikka karkausvuosi
End If
End If
Loop
End If
'suunilleen php:n tyylinen formaattihommeli
kyssärit = Array("d", "D", "F", "g", "G", "h", "H", "i", "j", "l", "L", "m", "M", "n", "s", "t", "U", "w", "Y", "y", "z")
vastaukset = Array(nollaa(päivä), Left(pvä(Viikonpäivä), 2), kuu(kuukausi - 1) + "kuu", (tunti Mod 12) + 1, tunti, nollaa((tunti Mod 12) + 1), nollaa(tunti), nollaa(minuutti), kuukausi, pvä(Viikonpäivä), Abs(CInt(karkaa(vuosi))), nollaa(kuukausi), kuu(kuukausi - 1), kuukausi, nollaa(sekunti), pvät(kuukausi - 1), Leima, Viikonpäivä, vuosi, Right(vuosi, 2), päivät)
'ja muunnetaan vormaatimerkit oikeiksi arvoiksi
Dim merkki As String
For i = 1 To Len(Vormaatti)
merkki = Mid(Vormaatti, i, 1)
For j = 0 To UBound(kyssärit)
If merkki = kyssärit(j) Then
merkki = vastaukset(j)
Exit For
End If
Next
returni = returni + merkki
Next
PuraLeima = returni
End Function
Function karkaa(v) 'tsekkaa onko v karkausvuosi, varmuuden vuoks sulkeita voi olla pari liikaa =P
karkaa = (((v Mod 100) <> 0) And ((v Mod 4) = 0)) Or ((v Mod 400) = 0)
End Function
Function nollaa(mitä) 'lisää tarvittaessa nollan eteen, esim 15:2:3 on tyhmempi aika kuin 15:02:03
nollaa = IIf(mitä < 10, "0", "") & mitä
End FunctionOli varmasti. Kamalan tylsää koodia. :P
Hieno koodi. Tiedä, vaikka joskus olis käyttöä.
ööö... Tämä tekee siis mitä?
Jälleen kommentoin vanhan koodin nostoon.
Tämä on ilmeisesti esimerkki, mitä ei kannata tehdä.
Unix aikaleiman voi muuntaa VB6-muotoon seuraavasti:
Vb6Aika = CDate(UnixAikaleima / 86400 + DateSerial(1970, 1, 1))
Päivämäärän muotoiluunkin VB6:ssa on valmiiksi toiminnot, joten PHP:n emuloimiselle en näe järkeä.
Esim.
Muotoiltu = Format(Vb6Aika, "d.m.yyyy h:mm")
Suoraviivainen toteutus. Joskus voi harjoitusmielessä tehdä oman toteutuksen olemassa olevalle standardi toteutukselle.
Usein käytämme valmiista paketista jotain koodia sen enempää miettimättä ja saman toteutuksen olisi pienellä vaivalla koodannut itse. Samalla syntyisi ymmärrys, miten toimii ja mitkä ovat mahdolliset reunatapaukset ja virhepaikat. Päivämäärien ja kellojen käsittelyyn en kyllä lähtisi missään nimessä tekemään omaa toteutusta, kun valmiit kirjastot löytyy kaikille alustoille ja tarve ei varmasti jää vain siihen pieneen ympäristöön, jota ensimmäisenä ajattelee, kun päättää tehdä itse.
Grez kirjoitti:
Jälleen kommentoin vanhan koodin nostoon.
Koodi ja kommentit ovat 2004 ja 2005 vuosilta. Mistä nostoista puhut?
tkok kirjoitti:
Suoraviivainen toteutus. Joskus voi harjoitusmielessä tehdä oman toteutuksen olemassa olevalle standardi toteutukselle.
Toki se voi olla harjoitusmielessä järkevää, mutta jos sellaisen koodin julkaisee, niin on hyvä mainita asiasta. "Koodivinkistä" tulee ilman saatesanoja aloittalevalle koodarille helposti käsitys että "näin se kannattaa toteuttaa" ja pahimamssa tapauksessa copy&paste.
Yleensä niitä harjoituksien tuotoksia ei kannata käyttää missään projektissa, koska se lisää ylläpidettävän koodin määrää. Eri asia tietysti jos vakiokirjastoihin sisältyvä implementaatio on jotenkin viallinen tai käyttökelvoton.
tkok kirjoitti:
Koodi ja kommentit ovat 2004 ja 2005 vuosilta. Mistä nostoista puhut?
Tuossa ohjelmointiputkan oikeassa palstassa on toiseksi viimeisenä "boksina" Koodivinkit ja siinä on tuollainen "Päivän nosto". Tänään päivän nostona on "QB: Näppäinyhdistelmät"