Wie Unix Time Stamp mit 64 Bit berechnen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Wie Unix Time Stamp mit 64 Bit berechnen?

Beitrag 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!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Little John

Beitrag von Little John »

Ich glaube, ich habe das Problem nicht ganz verstanden. Warum nimmst Du nicht Date() und FormatDate()?

Gruß, Little John
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Weil das nicht Jahr 2038-fähig ist.
Little John

Beitrag von Little John »

Huhh? Das sollte mal geändert werden. :-)
Brauchst Du die Berechnung in beiden Richtungen?

Gruß, Little John
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ....
Zuletzt geändert von STARGÅTE am 06.08.2008 16:47, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Mr.Vain
Beiträge: 88
Registriert: 29.10.2009 00:14

Re: Wie Unix Time Stamp mit 64 Bit berechnen?

Beitrag 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?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie Unix Time Stamp mit 64 Bit berechnen?

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Wie Unix Time Stamp mit 64 Bit berechnen?

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten