Login Register
Frontpage Code library Pastebin

Time2() ja Date2()

Author: valtzu
Added: 25. huhtikuuta 2011 kello 21.37
Edited: 5. lokakuuta 2013 kello 15.34
Category: Järjestelmä

Description

Ajan ja päivämäärän muotoilufunktiot. Date2() toimii samaan tapaan kuin PHP:n date-funktio (http://php.net/manual/en/function.date.php), ja Time2() toimii samalla lailla kuin PHP:n time(), eli funktio palauttaa unixtimestampin. Koodissa on esimerkki mukana.

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

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

#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=""

Leave a comment

You must be logged in to comment.