Time2() ja Date2()
Author: valtzu
        Added: 25. huhtikuuta 2011 kello 21.37
        Edited: 5. lokakuuta 2013 kello 15.34
        Category: Järjestelmä
    
Description
Code
Select all| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | // Aikafunktiot by Valtzu (17.12.2006)
// Korjattu 18.12.2006
// Muokattu 10.2.2007
// 09.07.2007: Systeemi muutettu käyttämään UnixTimestamppia
// 19.08.2007: Lisätty tavaraa...
// 01.01.2008: Bugikorjaus
// 02.01.2008: Vihdoin ja viimein usean työtunnin tuloksena sain lisättyä viikkonumeron! (W)
// 05.01.2008: Date2()-funktiota optimoitu, enää funktio ei ole niin raskas
//           : Samalla sain pois myös ylimääräisen __Replace2()-funktion
// 05.10.2013: Korjattu \\-bugi Date2-funktiossa (kiitos Jare & VesQ)
// Esimerkki
Repeat
    Text 0,0, Date2("l jS \of F \i\n Y h:i:s A")
    
    year  = Date2("Y") // Vuosi
    month = Date2("n") // Kuukausi
    day   = Date2("j") // Päivä
    
    // Luodaan aikaleima tästä päivästä, klo 00:00:00
    today = Time2(day, month, year, 00, 00, 00)
    
    // Luodaan aikaleima seuraavan vuoden kesäkuun ensimmäisestä päivästä
    june  = Time2(1, 6, (year+1), 00, 00, 00)
    
    Text 10,40,"Vuoden "+(year+1)+" kesäkuun alkuun "+((june-today)/(24*3600))+" päivää"
    Text 20,80,Date2("j.n.Y H:i:s")
    Text 30,120,"Your current FPS is "+FPS()
    DrawScreen
Forever
////--- FUNKTIOT ---////
// Aikaleimafunktio, palauttaa kokonaisluvun nykyisestä ajasta. Esim. 1183966740
// Funktiolle voi myös antaa parametreinä jonkun muun ajan kuin nykyisen,
// järjestys on päivä,kuukausi,vuosi,tunnit,minuutit,sekuntit
Function Time2(pp=0,kk=0,vvvv=0,tt=0,mm=0,ss=0)
    If pp=0 Or kk=0 Or vvvv=0 Then
        now    = 1
        pvm$  = Date()
        pp    = Left(pvm,2)
        vvvv  = Right(pvm,4)
        Select Lower(Mid(pvm,4,3))
            Case "jan" : kk = 1
            Case "feb" : kk = 2
            Case "mar" : kk = 3
            Case "apr" : kk = 4
            Case "may" : kk = 5
            Case "jun" : kk = 6
            Case "jul" : kk = 7
            Case "aug" : kk = 8
            Case "sep" : kk = 9
            Case "oct" : kk = 10
            Case "nov" : kk = 11
            Case "dec" : kk = 12
        End Select
    EndIf
    stamp = (vvvv-1970)*(365*(24*3600))
    For i=1970 To vvvv-1
        If (i Mod 400 = 0) Or (i Mod 4 = 0 And i Mod 100 <> 0) Then stamp=stamp+(3600*24)
    Next i
    karkausvuosi=(vvvv Mod 400 = 0) Or (vvvv Mod 4 = 0 And vvvv Mod 100 <> 0)
    kkdata$="31"+(28+karkausvuosi)+"31303130313130313031"
    For i=1 To kk-1
        päiviä=päiviä+Int(Mid(kkdata,i*2-1,2))
    Next i
    päiviä = päiviä+pp-1
    stamp  = stamp + päiviä*(3600*24)
    If now Then
        aika$ = Time()
        tt    = Int(Left(aika,2))
        mm    = Int(Mid(aika,4,2))
        ss    = Right(aika,2)
    EndIf
    stamp    = stamp + ((tt-3)*3600)+(mm*60)+ss
    Return stamp
End Function
// Funktio toimii samaan tapaan kuin php:ssä date-funktio
// Katso ohjeet http://fi.php.net/manual/en/function.date.php
// Merkit, jotka muunnetaan ajaksi ovat A,a,D,d,F,G,g,H,h,i,j,L,l,M,m,N,n,o,t,S,s,U,Y,y,W,w,z
// Takakenoviiva (\) minkä tahansa merkin edessä estää merkin muuntamisen ajaksi
Function Date2(muoto$="j.n.Y H:i:s",aikaleima=-99999999)
    If aikaleima=-99999999 Then aikaleima=Time2()
    original=aikaleima : aikaleima=aikaleima+3*3600
    vvvv=1970
    While True
        asd=asd+365*24
        If asd*3600>aikaleima Then Exit
        If (vvvv Mod 400 = 0) Or (vvvv Mod 4 = 0 And vvvv Mod 100 <> 0) Then ta=ta+(3600*24) Then asd=asd+24
        vvvv+1
    Wend
    karkausvuosi=(vvvv Mod 400 = 0) Or (vvvv Mod 4 = 0 And vvvv Mod 100 <> 0)
    pp  = ((aikaleima-ta) Mod (365*24*3600))/(3600*24)+1
    pt  = pp
    kkdata$="31"+(28+karkausvuosi)+"31303130313130313031"
    While 1
        kk+1
        tmp=Int(Mid(kkdata,kk*2-1,2))
        If pp>tmp Then pp=pp-tmp Else Exit
    Wend
    tt  = (aikaleima/3600) Mod 24
    mm  = (aikaleima/60) Mod 60
    ss  = aikaleima Mod 60
    ampm$ = Replace(Replace(Str((tt>11)),"0","am"),"1","pm")
    wd$ = Str((aikaleima/(24*3600) + 4) Mod 7)
    If InStr(muoto,"D") Or InStr(muoto,"l") Then
        If wd=0 Then wds$="Sunday"
        If wd=1 Then wds$="Monday"
        If wd=2 Then wds$="Tuesday"
        If wd=3 Then wds$="Wednesday"
        If wd=4 Then wds$="Thursday"
        If wd=5 Then wds$="Friday"
        If wd=6 Then wds$="Saturday"
    EndIf
    If InStr(muoto,"M") Or InStr(muoto,"F") Then
        If kk=1  Then ws$="January"
        If kk=2  Then ws$="February"
        If kk=3  Then ws$="March"
        If kk=4  Then ws$="April"
        If kk=5  Then ws$="May"
        If kk=6  Then ws$="June"
        If kk=7  Then ws$="July"
        If kk=8  Then ws$="August"
        If kk=9  Then ws$="September"
        If kk=10 Then ws$="October"
        If kk=11 Then ws$="November"
        If kk=12 Then ws$="December"
    EndIf
    If InStr(muoto,"W") Or InStr(muoto,"o") Then
        firstday=(vvvv-1970+(ta/(3600*24))-4) Mod 7
        firstday=firstday+(firstday<0)*7+1
        pyl=((vvvv-1) Mod 400=0) Or ((vvvv-1) Mod 4=0 And (vvvv-1) Mod 100>0)
        wkd=(Int(wd)=0)*7+(Int(wd)>0)*(Int(wd))
        If pt <= (8-firstday) And firstday>4 Then
            y=vvvv-1
            week=52+(firstday=5 Or (firstday=6 And pyl))
        Else 
            y=vvvv
        EndIf
        If ((365+(y=vvvv And karkausvuosi))-pt) < (4-wkd) Then y=vvvv+1 Then week=1
        If y=vvvv Then week=(pt+(7-wkd)+(firstday-1))/7-(firstday>4)
        weekn$=String("0",2-Len(Str(week)))+Str(week):weeky=y
    EndIf
    tm = Right(Str(pp),1)
    out$="":d$=""
    For i=1 To Len(muoto)
        b$=Mid(muoto,i,1)
        If b2$="\" Or b="\" Then
            If b="\" And b2<>"\" Then d="" Else d=b : b=""
        Else
            Select b
                Case "A":d=Upper(ampm)
                Case "a":d=ampm
                Case "D":d=wds
                Case "d":d=String("0",2-Len(Str(pp)))+pp
                Case "F":d=Left(ws,3)
                Case "G":d=String("0",2-Len(Str(tt)))+tt
                Case "g":d=(tt-((tt>12)*12))
                Case "H":d=String("0",2-Len(Str(tt)))+tt
                Case "h":d=String("0",Int((tt-((tt>12)*12)<10)))+Str(tt-((tt>12)*12))
                Case "i":d=String("0",2-Len(Str(mm)))+mm
                Case "j":d=pp
                Case "L":d=karkausvuosi
                Case "l":d=Left(wds,3)
                Case "M":d=ws
                Case "m":d=String("0",2-Len(Str(kk)))+kk
                Case "N":d=((Int(wd)=0)*7+(Int(wd)<>0)*(Int(wd)+1))
                Case "n":d=kk
                Case "o":d=weeky
                Case "t":d=Mid(kkdata,kk*2-1,2)
                Case "S":d=String("st",(tm=1))+String("nd",(tm=2))+String("rd",(tm=3))+String("th",(tm>3))
                Case "s":d=String("0",2-Len(Str(ss)))+ss
                Case "U":d=original
                Case "Y":d=vvvv
                Case "y":d=Right(Str(vvvv),2)
                Case "W":d=weekn
                Case "w":d=wd
                Case "z":d=pt
                Default :d=b
            End Select
        EndIf
        out=out+d : b2$=b
    Next i
    Return out
End Function
 | 
Comments
#37 Sent by: VesQ, 27. elokuuta 2012 kello 17.38
Korjasinpa huvikseni tämän funkkarin toimimaam myös kenoviivojen escapettamisen kanssa.
http://www.cbrepository.com/pastebin/3l/
#38 Sent by: VesQ, 27. elokuuta 2012 kello 17.41
Oikeastaan tämä onkin vähän elegantimpi tapa ratkaista asia.
http://www.cbrepository.com/pastebin/3m/
Muutin vain
If b="\" And b2<>"\" Then d="" Else d=b
seuraavaksi
If b="\" And b2<>"\" Then d="" Else d=b : b=""
#34 Sent by: Jare, 5. heinäkuuta 2012 kello 12.56
Tätä olen käyttänyt monesti ja tämä on todella hyödyllinen, mutta nyt törmäsin bugiin: kenoviivan escapettaminen toisella kenoviivalla ei toimi:
MakeError Date2("Y\\m\\d")
Tulos: 2012\m\d
(Pitäisi olla 2012\07\05)