Kirjautuminen

Haku

Tehtävät

Koodit: VB6: UNIX-aikaleiman purku

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 Function

Kommentit

tekojalka [29.06.2004 01:16:26]

#

Oli varmasti. Kamalan tylsää koodia. :P

Blaze [29.06.2004 02:07:14]

#

Hieno koodi. Tiedä, vaikka joskus olis käyttöä.

Basic 6.0 [03.03.2005 18:17:22]

#

ööö... Tämä tekee siis mitä?

Grez [09.01.2020 13:05:27]

#

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")

tkok [10.01.2020 09:36:03]

#

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?

Grez [10.01.2020 09:53:54]

#

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"

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta