Seite 1 von 1

Wie Unix Time Stamp mit 64 Bit berechnen?

Verfasst: 06.08.2008 14:24
von NicTheQuick
Hallo Leute.

Ich glaube ich bin zu blöd zum Suchen. Im Forum finde ich nichts passendes
darüber und bei Google gibt es nur fertige Rechner.

Ich suche einfach die Formel um Jahr, Monat, Tag, Stunde, Minute und
Sekunde in das Unix-Format zu übertragen. Die letzten drei sind ja kein
Problem, aber vom Zeitstempel zurück in das gebrochene Datumsformat ist
schwer.
Hat das zufällig schonmal jemand gemacht oder kennt einen Link, der den
Algorithmus erklärt? Das bräuchte ich für mein aktuelles Projekt.

Achja. API nützt mir nichts, außer ihr habt entsprechende Pendants für
Linux. Das Programm soll später nämlich auf Windows und Linux genau
gleich funktionieren und reagieren.

Danke schonmal!

Verfasst: 06.08.2008 14:52
von STARGÅTE
verstehe ich dich richtig,
dass du einfach "per Hand" von einer Zahl (Zeitstempel) die genannten Zeiteinheiten ermitteln willst ?

Das heißt du hast probleme mit den unregelmäßigen Monatslängen und Jahreslängen ?

Da dort ja trotzdem eine regelmäzigkeit auftritt (Formel) könnte man mehrere Modulo funktionne hintereinander schalten um möglichst wenig If abfragen zu haben...

Wenn ich das richtig verstanden habe, kann ich mich ja mal dran versuchen...

Verfasst: 06.08.2008 16:27
von Little John
Ich glaube, ich habe das Problem nicht ganz verstanden. Warum nimmst Du nicht Date() und FormatDate()?

Gruß, Little John

Verfasst: 06.08.2008 16:35
von NicTheQuick
Weil das nicht Jahr 2038-fähig ist.

Verfasst: 06.08.2008 16:40
von Little John
Huhh? Das sollte mal geändert werden. :-)
Brauchst Du die Berechnung in beiden Richtungen?

Gruß, Little John

Verfasst: 06.08.2008 16:43
von STARGÅTE
hier meine derzeitigen Proceduren :

Code: Alles auswählen



Procedure SecondQ(Time.q)
 Second = (Time) % 60 
 ProcedureReturn Second
EndProcedure

Procedure MinuteQ(Time.q)
 Minute = (Time / 60) % 60
 ProcedureReturn Minute
EndProcedure

Procedure HourQ(Time.q)
 Hour = (Time / 3600) % 24
 ProcedureReturn Hour
EndProcedure



Procedure DayInYearQ(Time.q)
 TempDays.q = Time / 86400
 TempYear.q = TempDays / 365
 ; Schaltjahre
 SJ4 = (TempYear+1)/4
 SJ100 = (TempYear+69)/100
 SJ400 = (TempYear+369)/400 
 SD = SJ4-SJ100+SJ400
 TempYearDay = (TempDays - SD) % 365 +1
 Year = (TempDays - SD) / 365 + 1970
 If 365-TempYearDay < SD
  If Not Year % 4 : Add + 1 : EndIf
  If Not Year % 100 : Add - 1 : EndIf
  If Not Year % 400 : Add + 1 : EndIf
 EndIf
 ProcedureReturn TempYearDay+Add
EndProcedure



Procedure YearQ(Time.q)
 TempDays = Time / 86400
 TempYear = TempDays / 365
  SJ4 = (TempYear+1)/4
  SJ100 = (TempYear+69)/100
  SJ400 = (TempYear+369)/400 
  SD = SJ4-SJ100+SJ400
 Year = (TempDays - SD) / 365 + 1970
 ProcedureReturn Year
EndProcedure

Procedure MonthQ(Time.q)
 Year = YearQ(Time)
 DayInYear = DayInYearQ(Time)
 If DayInYear > 31+28
  If Not Year % 4   : Add + 1 : EndIf
  If Not Year % 100 : Add - 1 : EndIf
  If Not Year % 400 : Add + 1 : EndIf
 EndIf
 Restore MonthDays
 For n = 1 To 12
  Read MonthDays
  If n = 2 : MonthDays+Add : EndIf
  If DayInYear < MonthDays+1
   ProcedureReturn n
  EndIf
  DayInYear - MonthDays
 Next 
EndProcedure

Procedure DayQ(Time.q)
 Year = YearQ(Time)
 DayInYear = DayInYearQ(Time)
 If DayInYear > 31+28
  If Not Year % 4   : Add + 1 : EndIf
  If Not Year % 100 : Add - 1 : EndIf
  If Not Year % 400 : Add + 1 : EndIf
 EndIf
 Restore MonthDays
 For n = 1 To 12
  Read MonthDays
  If n = 2 : MonthDays+Add : EndIf
  If DayInYear < MonthDays+1
   ProcedureReturn DayInYear
  EndIf
  DayInYear - MonthDays
 Next 
EndProcedure

DataSection
 MonthDays:
 Data.l 31,28,31,30,31,30,31,31,30,31,30,31
EndDataSection

Code: Alles auswählen

Time.q = Date()
Debug Str(DayQ(Time))+"."+Str(MonthQ(Time))+"."+Str(YearQ(Time))+" "+Str(HourQ(Time))+":"+Str(MinuteQ(Time))+":"+Str(SecondQ(Time))
Werde im Laufe des Tages noch änderungen vornehmen ....

Verfasst: 06.08.2008 16:45
von Kaeru Gaman
Date() ist eine 32bit-basierte Funktion, wie die Basis-Funktion von Windows.

> Huhh? Das sollte mal geändert werden.

nein, eben nicht, dann wäre es nicht mehr kompatibel mit windows.

...allerdings wäre es eine gute idee, zusätzlich die Funktionen für den 64bit-Timestamp nativ in PB anzubieten.

Re: Wie Unix Time Stamp mit 64 Bit berechnen?

Verfasst: 16.12.2009 19:29
von Mr.Vain
Habe auch eine Frage zum Timestamp:


Möchte Dateien in einem Verzeichnis löschen, die älter sind als x Tage

1. Wie kann ich dies realisieren?
2. Wie überprüfe ich, ob ein Ordner vorhanden ist?

Re: Wie Unix Time Stamp mit 64 Bit berechnen?

Verfasst: 16.12.2009 19:39
von STARGÅTE
mit ExamineDirectory(#Verzeichnis, VerzeichnisName$, Pattern$)
ein Ordner deiner Wahr auslesen ... mehr dazu in der Hilfe ...

Ergebnis = DirectoryEntryDate(#Verzeichnis, DatumsTyp)
Gibt dir dann das Datum als Zeitstempel zurück (jenachdem was du angibst, das änderungsdatum zB.)

1 Tag = 24*60*60

Älter als x Tage wäre also, wenn Ergebnis von oben:
Ergebnis < Date() - 24*60*60 * x

Date() wäre der aktuelle Zeitstempel ...

Odner ist vorhanden wenn :
DirectoryEntryType(#Verzeichnis) = #PB_DirectoryEntry_Directory

auch dazu mehr in der Hilfe.

Re: Wie Unix Time Stamp mit 64 Bit berechnen?

Verfasst: 16.12.2009 23:28
von mk-soft
Das Unix-Timeformat hat nichts mit Windows zu tun, sondern PB verwendet das Format um auch mit Linux kompatibel zu sein.
Somit ist es mit den Jahr 2038 schluss und wir Rentner werden wieder reanimiert um das Problem zu beseitigen. :mrgreen:

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