warum ist es notwendig, ein Startdatum zu setzen, was für mich bedeutet das die Zeitrechnung erst 1970 beginnt, was für mich selber natürlich nicht schlecht ist da ich dann einige Jährchen jünger bin. Aber trotz dieses Aspektes sollte man schon korrekt mit dem Jahr 0 beginnen. Ich habe deshalb mich ein bisschen mit dem Source Stargate beschäftigt und darauf aufbauend das folgende Programm, was sicherlich noch verbesserungsfähig ist, programmiert (PB4.3).
Code: Alles auswählen
; Gregorianischer Kalender
;~~~~~~~~~~~~~~~~~~~~~~~~~~
;{- Konstanten
#CT_Date_SekMin = 60
#CT_Date_MinStd = 60
#CT_Date_StdTag = 24
#CT_Date_TagJahr = 365
#CT_Date_SekStd = #CT_Date_MinStd * #CT_Date_SekMin
#CT_Date_SekTag = #CT_Date_StdTag * #CT_Date_SekStd
#CT_Date_TagMon = "31,28,31,30,31,30,31,31,30,31,30,31"
#CT_Date_Monate = "Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember"
#CT_Date_Tage = "Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag"
Enumeration
#CT_Date_Year
#CT_Date_Month
#CT_Date_Week
#CT_Date_Day
#CT_Date_Hour
#CT_Date_Minute
#CT_Date_Second
EndEnumeration
;} EndKonstanten
;{- Proceduren
Procedure.l CT_DayOfYear(Zeitwert.q)
Protected n.b, Tage.l, Jahre.l, SchaltTag.w
Tage = Zeitwert/#CT_Date_SekTag
While (Tage>0)
For n=1 To 12
Tage - Val(StringField(#CT_Date_TagMon, n, ","))
Next n
If Not Jahre%400 Or (Not Jahre%4 And Jahre%100): SchaltTag + 1: Tage - 1: EndIf
Jahre + 1
Wend
Zeitwert = Zeitwert - (Jahre * #CT_Date_TagJahr + SchaltTag) * #CT_Date_SekTag
Tage = Round(Zeitwert/#CT_Date_SekTag, #PB_Round_Up) + #CT_Date_TagJahr
ProcedureReturn Tage
EndProcedure
Procedure.q CT_Date(Jahr.l = 0, Monat.b = 0, Tag.b = 0, Stunde.b = 0, Minute.b = 0, Sekunde.b = 0)
Protected n.l, ZeitWert.q, SchaltTag.w
If (Jahr=0) And (Monat=0) And (Tag=0) And (Stunde=0) And (Minute=0) And (Sekunde=0)
Jahr = Year(Date()): Monat = Month(Date()): Tag = Day(Date())
Stunde = Hour(Date()): Minute = Minute(Date()): Sekunde = Second(Date())
EndIf
;Jahresrechnung:
For n=0 To (Jahr-1)
If Not n%400 Or (Not n%4 And n%100): SchaltTag + 1: EndIf
Next n
ZeitWert = ((Jahr-1) * #CT_Date_TagJahr + SchaltTag) * #CT_Date_SekTag
;Monatsberechnung:
For n=1 To (Monat-1)
Zeitwert + (Val(StringField(#CT_Date_TagMon, n, ",")) * #CT_Date_SekTag)
Next n
If (Monat>2) Or ((Monat=2) And (Tag=29))
If Not Jahr%400 Or (Not Jahr%4 And Jahr%100): ZeitWert + #CT_Date_SekTag: EndIf
EndIf
;Tagesberechnung:
Zeitwert + (Tag-1)* #CT_Date_SekTag
;Zeitberechnung:
Zeitwert + Stunde * #CT_Date_SekStd
Zeitwert + Minute * #CT_Date_SekMin
Zeitwert + Sekunde
ProcedureReturn Zeitwert
EndProcedure
Procedure.l CT_Year(Zeitwert.q)
Protected n.b, Tage.l, Jahr.l
Tage = Zeitwert/#CT_Date_SekTag
While (Tage>0)
For n=1 To 12
Tage - Val(StringField(#CT_Date_TagMon, n, ","))
Next n
If Not Jahr%400 Or (Not Jahr%4 And Jahr%100): Tage - 1: EndIf
Jahr + 1
Wend
ProcedureReturn Jahr
EndProcedure
Procedure.l CT_Month(Zeitwert.q)
Protected Jahr.l = CT_Year(Zeitwert)
Protected Tage.l = CT_DayOfYear(Zeitwert)
Protected Monat.b
If (Tage>59)
If Not Jahr%400 Or (Not Jahr%4 And Jahr%100): Tage - 1: EndIf
EndIf
For Monat=1 To 12
Tage - Val(StringField(#CT_Date_TagMon, Monat, ","))
If (Tage<=0): Break: EndIf
Next Monat
ProcedureReturn Monat
EndProcedure
Procedure.b CT_DayOfWeek(Zeitwert.q, wStart.c = #False)
Protected Tage.q = Zeitwert / #CT_Date_SekTag
Protected Wochentag.b
If wStart
WochenTag = (Tage%7)
If Not WochenTag: WochenTag = 7: EndIf
Else
WochenTag = (Tage%7)+1
EndIf
ProcedureReturn WochenTag
EndProcedure
Procedure.l CT_Day(Zeitwert.q)
Protected Jahr.l = CT_Year(Zeitwert)
Protected Monat.l = CT_Month(Zeitwert)
Protected Tage.l = CT_DayOfYear(Zeitwert)
If (Tage>59)
If Not Jahr%400 Or (Not Jahr%4 And Jahr%100): SchaltTag + 1: EndIf
EndIf
For n=1 To (Monat-1)
Tage - Val(StringField(#CT_Date_TagMon, n, ","))
If (n=2): Tage - SchaltTag: EndIf
Next n
ProcedureReturn Tage
EndProcedure
Procedure.l CT_Hour(Zeitwert.q)
Protected Stunde.l = (Zeitwert / #CT_Date_SekStd) % #CT_Date_StdTag
ProcedureReturn Stunde
EndProcedure
Procedure.l CT_Minute(Zeitwert.q)
Protected Minute.l = (Zeitwert / #CT_Date_SeKMin) % #CT_Date_MinStd
ProcedureReturn Minute
EndProcedure
Procedure.l CT_Second(Zeitwert.q)
Protected Sekunde.l = (Zeitwert) % #CT_Date_SekMin
ProcedureReturn Sekunde
EndProcedure
Procedure.s CT_FormatDate(Maske.s, ZeitWert.q)
Maske = ReplaceString(Maske, "%yyyy", Str(CT_Year (Zeitwert)))
Maske = ReplaceString(Maske, "%yy" , Right(Str(CT_Year (Zeitwert)), 2))
Maske = ReplaceString(Maske, "%mmmm", StringField(#CT_Date_Monate, CT_Month(Zeitwert), ","))
Maske = ReplaceString(Maske, "%mm" , RSet (Str(CT_Month (Zeitwert)), 2, "0"))
Maske = ReplaceString(Maske, "%dddd", StringField(#CT_Date_Tage , CT_DayOfWeek(Zeitwert), ","))
Maske = ReplaceString(Maske, "%dd" , RSet (Str(CT_Day (Zeitwert)), 2, "0"))
Maske = ReplaceString(Maske, "%hh" , RSet (Str(CT_Hour (Zeitwert)), 2, "0"))
Maske = ReplaceString(Maske, "%ii" , RSet (Str(CT_Minute(Zeitwert)), 2, "0"))
Maske = ReplaceString(Maske, "%ss" , RSet (Str(CT_Second(Zeitwert)), 2, "0"))
ProcedureReturn Maske
EndProcedure
Procedure.q CT_ParseDate(Maske.s, ZeitWert.s)
Protected Jahr.l, Mon.b, Tag.b, Std.b, Min.b, Sek.b
Protected Separator.s, n.b, DZ.q
n = FindString(Maske," ", 1)
Protected DMask.s = Left(Maske , n-1)
Protected ZMask.s = Mid (Maske , n+1)
n = FindString(ZeitWert," ", 1)
Protected Datum.s = Left(ZeitWert, n-1)
Protected Zeit.s = Mid (ZeitWert, n+1)
Separator = Mid(DMask, FindString(DMask, "%", 2)-1,1)
For n=1 To (CountString(DMask, Separator)+1)
Select LCase(StringField(DMask, n, Separator))
Case "%dd" : Tag = Val(StringField(Datum, n, Separator))
Case "%mm" : Mon = Val(StringField(Datum, n, Separator))
Case "%yy" : Jahr = 2000 + Val(StringField(Datum, n, Separator))
Case "%yyyy": Jahr = Val(StringField(Datum, n, Separator))
EndSelect
Next n
Separator = Mid(ZMask, FindString(ZMask, "%", 2)-1,1)
For n=1 To (CountString(ZMask, Separator)+1)
Select LCase(StringField(ZMask, n, Separator))
Case "%hh": Std = Val(StringField(Zeit, n, Separator))
Case "%ii": Min = Val(StringField(Zeit, n, Separator))
Case "%ss": Sek = Val(StringField(Zeit, n, Separator))
EndSelect
Next n
DZ = CT_Date(Jahr, Mon, Tag, Std, Min, Sek)
ProcedureReturn DZ
EndProcedure
Procedure.q CT_AddDate(Datum.q, Feld.c, ZeitWert.l)
Protected Jahr.l = CT_Year (Datum)
Protected Mon.b = CT_Month (Datum)
Protected Tag.b = CT_Day (Datum)
Protected Std.b = CT_Hour (Datum)
Protected Min.b = CT_Minute(Datum)
Protected Sek.b = CT_Second(Datum)
Select Feld
Case #CT_Date_Year
Jahr + Zeitwert
Datum = CT_Date(Jahr, Mon, Tag, Std, Min, Sek)
Case #CT_Date_Month
Mon + Zeitwert
If (Mon>12): Jahr + (Mon/12): Mon % 12: EndIf
Datum = CT_Date(Jahr, Mon, Tag, Std, Min, Sek)
Case #CT_Date_Week,#CT_Date_Day
If (Feld=#CT_Date_Week): ZeitWert * 7: EndIf
Repeat
If (ZeitWert>Val(StringField(#CT_Date_TagMon, Mon, ",")))
ZeitWert - Val(StringField(#CT_Date_TagMon, Mon, ","))
Mon + 1
Select Mon
Case 02: If Not Jahr%400 Or (Not Jahr%4 And Jahr%100): Tag - 1: EndIf
Case 13: Jahr + 1: Mon = 1
EndSelect
Else
Tag + ZeitWert: Break
EndIf
ForEver
Datum = CT_Date(Jahr, Mon, Tag, Std, Min, Sek)
Case #CT_Date_Hour
Datum + (Zeitwert * #CT_Date_SekTag)
Case #CT_Date_Minute
Datum + (Zeitwert * #CT_Date_SekMin)
Case #CT_Date_Second
Datum + ZeitWert
EndSelect
ProcedureReturn Datum
EndProcedure
;} EndProceduren
Ich habe Ihn auch geprüft und keine keine Fehler gefunden, was natürlich nichts heißt.