Seite 1 von 1

[s]Eigener Timestamp[/s] erweitertes Datum für Linux

Verfasst: 16.02.2014 00:58
von es_91
Für ein Projekt ist es notwendig, dass Data (Data = lat. Mehrzahl von Datum) gespeichert werden, die teilweise weit vor 1970 und teilweise etwas nach 2038 liegen. Der in PureBasic verwendete Unix Time Stamp ist damit nicht anwendbar, glaube ich.

Also wollte ich eine eigene Datumsverwaltung schreiben, die ich dann in mein Projekt einbaue. Hierbei ist einige Rechenarbeit von Nöten, noch wichtiger aber ist, dass ich den Julianischen Kalender richtig verstanden habe, deshalb frage ich hier nach.

Also ... es gibt Schaltjahre, die den 29. Februar einführen, aller vier Jahre, die durch vier teilbar sind. Ansonsten verläuft das Datum regelmäßig, also 7 Wochentage, 24 Stunden je Tag, keine Stunde hat mehr als 60 Minuten, keine Minute mehr als 60 Sekunden, usw. das ganze 365 oder 366 Tage im Jahr beginnend bei Jahr 1(!) .

Was gibt es noch zu beachten? Mir schwant, ich vergesse da etwas. War da nicht etwas mit einer Ungenauigkeit des Julianischen Kalenders, die irgendwie bereinigt werden muss, aller hundert Jahre, oder so?

Re: Eigener Timestamp - was beachten?

Verfasst: 16.02.2014 01:07
von es_91
Wikipedia beantwortet meine Fragen: "Die Verkürzung [von 365,25 Tage auf 365,24irgendwas; Anm. v. es_91] erfolgte mit Hilfe einer weiteren, übergeordneten Schaltregel, nach der diejenigen Säkularjahre (Jahre, deren Zahl durch 100 ohne Rest teilbar ist), deren Zahl dividiert durch 400 keine ganze Zahl ergibt, keine Schaltjahre sind."

Also, wenn mein Kalender am 1. Januar 1900 beginnen sollte und etwa 200 Jahre lang halten soll, muss ich nur beachten, dass das Jahr 1900 und das Jahr 2100 keine Schaltjahre sind.

Ansonsten ist alles analog, oder? 8)

Und ein kleines EDIT: Wir verwenden nicht den Julianischen Kalender, sondern den Gregorianischen. :doh:

Re: Eigener Timestamp - Optimierungen?

Verfasst: 16.02.2014 10:49
von es_91
Bevor ich dieses Projekt weiterentwickle und in der Code-Sektion online stelle, möchte ich Euch fragen, ob Euch etwaige Optimierungen zu meiner Monats-Fallunterschied-Methode einfallen. Etwa alle Monate in eine strukturierte Liste packen, die die jeweilige Anzahl der Tage speichert und dann die Liste durchlaufen lassen . . .

Ich weiß es nicht genau, was besser ist. Darum frage ich Euch.

Hier ist mein Code bis jetzt:

Code: Alles auswählen

; DateX Time Stamp v. 1.00
; PureBasic: 5.21 LTS
; Demo: No
;
; Supported dates: 01.01.1900 0:00:00 to 31.01.2699 23:59:59

; **** Remove this if you use this in your own code ****
EnableExplicit
; ********

Procedure.q DateX(Year = #PB_Any, Month = #PB_Any, Day = #PB_Any, Hour = #PB_Any, Minute = #PB_Any, Second = #PB_Any)
  
  Define DateX, ThisYear, DaysTotal, DayOfYear
  
  If Year = #PB_Any
    ProcedureReturn DateX(1970, 1, 1, 0, 0, 0) + Date()
  Else
    For ThisYear = 1900 To Year
      DayOfYear = 0
      If ThisYear = 1900 Or ThisYear = 2100 Or ThisYear = 2200 Or ThisYear = 2300 Or ThisYear = 2500 Or Not Int(ThisYear/4)*4 = ThisYear
        If ThisYear = Year
          If Month > 1
            DayOfYear + 31
          EndIf
          If Month > 2
            DayOfYear + 28
          EndIf
          If Month > 3
            DayOfYear + 31
          EndIf
          If Month > 4
            DayOfYear + 30
          EndIf
          If Month > 5
            DayOfYear + 31
          EndIf
          If Month > 6
            DayOfYear + 30
          EndIf
          If Month > 7
            DayOfYear + 31
          EndIf
          If Month > 8
            DayOfYear + 31
          EndIf
          If Month > 9
            DayOfYear + 30
          EndIf
          If Month > 10
            DayOfYear + 31
          EndIf
          If Month > 11
            DayOfYear + 30
          EndIf
          If Not ThisYear = Year
            DayOfYear + 31
          Else
            DayOfYear + Day
          EndIf
          DaysTotal + DayOfYear
        Else
          DaysTotal + 365
        EndIf
      Else
        If ThisYear = Year
          If Month > 1
            DayOfYear + 31
          EndIf
          If Month > 2
            DayOfYear + 29
          EndIf
          If Month > 3
            DayOfYear + 31
          EndIf
          If Month > 4
            DayOfYear + 30
          EndIf
          If Month > 5
            DayOfYear + 31
          EndIf
          If Month > 6
            DayOfYear + 30
          EndIf
          If Month > 7
            DayOfYear + 31
          EndIf
          If Month > 8
            DayOfYear + 31
          EndIf
          If Month > 9
            DayOfYear + 30
          EndIf
          If Month > 10
            DayOfYear + 31
          EndIf
          If Month > 11
            DayOfYear + 30
          EndIf
          If Not ThisYear = Year
            DayOfYear + 31
          Else
            DayOfYear + Day
          EndIf
          DaysTotal + DayOfYear
        Else
          DaysTotal + 366
        EndIf
      EndIf
    Next
    
    ProcedureReturn (DaysTotal - 1) * 24 * 60 * 60 + Hour * 60 * 60 + Minute * 60 + Second
    
  EndIf
  
EndProcedure

Debug DateX()
Geprüft und getestet. :)

Re: Eigener Timestamp - Optimierung erbeten

Verfasst: 16.02.2014 12:52
von mk-soft
Für Windows habe ich folgenden Code.

http://www.purebasic.fr/german/viewtopi ... =8&t=14159

Ist somit auch mit z.B. excel kompatibel

Re: Eigener Timestamp - Optimierung erbeten

Verfasst: 16.02.2014 13:43
von es_91
Ja, danke, aber ich brauch's auch für Linux. :)

Re: [s]Eigener Timestamp[/s] erweitertes Datum für Linux

Verfasst: 20.02.2014 10:13
von es_91
Kann mir jemand sagen, wie ich unter Linux einem DateGadget ein Datum von vor 1970 einhauchen kann?

Re: [s]Eigener Timestamp[/s] erweitertes Datum für Linux

Verfasst: 21.02.2014 10:44
von Chimorin
Da würde mir nur einfallen:
Selber programmieren.

Oder einfach das Vorgefertigte verwenden; Unter Windows funktioniert das.
Bild