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