FormatDate mit Millisekunden?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

FormatDate mit Millisekunden?

Beitrag von Kiffi »

Hallo,

ich generiere mehrere Dateien über einen längeren Zeitraum und benenne
sie dann mittels aktuellem Datum und Zeit der Generierung.

FormatDate("%yyyy%mm%dd%hh%ii%ss", Date())

Generiert mir:

C:\temp\20041010123044.txt
C:\temp\20041010123045.txt
C:\temp\20041010123046.txt

Nun kann es vorkommen, daß in der selben Sekunde zwei oder mehr
Dateien geschrieben werden. Aus diesem Grund würde ich gerne noch die
Angabe der Millisekunden an den Dateinamen hängen.

C:\temp\2004101012304602.txt
C:\temp\2004101012304612.txt
C:\temp\2004101012304705.txt

Leider habe ich noch nicht gefunden, wie ich dieses bewerkstelligen könnte.

Any hints?

Danke im voraus & Grüße ... Kiffi
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Du könntest doch auch anstatt die Millisekunden hinzuschreiben einfach irgendwo eine globale strukturierte Variable machen, wo drinn steht, wieviele Dateien schon mit der aktuellen Zeit geschrieben worden sind. Dann kannst du eine Dateinummer dahinter schreiben.
Bsp.:
Structure
AnzDateien.l
AktZeit.l
EndStructure

Und jetzt einfach immer wenn die AktZeit mit der Aktuellen Zeit nicht mehr übereinstimmt, AnzDateien auf 0 setzten. Und wenn eine neue Datei in der gleichen Zeit erstellt wird, die AnzDateien + 1 rechnen!

greetz
remi
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von NicTheQuick »

Am Anfang lässt rechnest du ein Offset für [c]ElapsedMilliseconds()[/c] aus, damit dies immer Null ist, wenn die Sekunden von [c]Date()[/c] umspringen

Code: Alles auswählen

sek_old.l = Second(Date())
Repeat
  Offset = ElapsedMilliseconds() % 1000
Until (Second(Date()) - sek_old + 60) % 60 = 1
und dann nimmst du immer folgenden Code zum Dateinamen generieren

Code: Alles auswählen

FormatDate("%yyyy%mm%dd%hh%ii%ss", Date()) + RSet(Str((ElapsedMilliseconds() - Offset) % 1000), 4, "0")
Bild
Smash
Beiträge: 23
Registriert: 10.10.2004 00:09

Beitrag von Smash »

Hallo Kiffi,
Ist vielleicht nicht die beste Variante aber eventuell hilft es ja.

Code: Alles auswählen

Global Millisekunden.f
Millisekunden.f = 0

Procedure Schreibe()
  Millisekunden.f = Millisekunden.f +1
  Debug FormatDate("%yyyy%mm%dd%hh%ii%ss",Date()) + Str(Millisekunden.f)
EndProcedure

Repeat
  Schreibe()
  Delay(100)
ForEver
End 
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Ich weiss jetzt zwar nicht wie schnell solche Dateizugriffe sind, aber ich denke, dass es trotzdem noch vorkommen kann, dass 2 Dateien innerhalb von 10ms geschrieben werden können (Die Genauigkeit von ElapsedMilliseconds() ist ja etwa 10ms). Deshalb habe ich auch die kompliziertere Methode vorgeschlagen.
greetz
remi

EDIT: Smashs Beitrag hab ich übersehen. Der ist natürlich noch einfacher (nimm aber nicht Floats und setze Millisekunden auch mal wieder auf 0)!
Zuletzt geändert von remi_meier am 10.10.2004 12:58, insgesamt 1-mal geändert.
Smash
Beiträge: 23
Registriert: 10.10.2004 00:09

Beitrag von Smash »

Mann seid ihr alle schnell!
Ps.
Super das die Suche in der HTML Hilfe
Milliseconds nicht auf ElapsedMilliseconds() verweist.
Bis eben dachte ich den Befehl gibt es überhaupt nicht.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

In diesem Fall ists ja auch besser, dass du ihn nicht gefunden hast :D
Kannst auch GetTickCount_() oder timeGetTime_() verwenden (WinAPI)!
Ich glaube, für die Suchfunktion der Hilfe kannste M$ verantwortlich machen :lol:
Smash
Beiträge: 23
Registriert: 10.10.2004 00:09

Beitrag von Smash »

Mach ich _________ :twisted: M$ :twisted:

Danke für die APIs :allright:

____________________________________________

@remi, Wieso keine Floats ?
Die hab ich benutzt weil sie angeblich unlimitiert sind.


Hab’s aber hier noch mal überarbeitet

Code: Alles auswählen

OpenWindow(0, 30, 200, 200, 20, #PB_Window_SystemMenu, "EXIT")
Global MilliNr.w : MilliNr.w = 0
Global Tick.s : Tick.s = "0"

Procedure Schreibe()
  If FormatDate("%ss",Date()) <> Tick.s
     Tick.s = FormatDate("%ss",Date())
     MilliNr.w = 0
  EndIf
  Debug FormatDate("%yyyy%mm%dd%hh%ii%ss",Date()) +"-"+ Str(MilliNr.w)
  MilliNr.w = MilliNr.w +1 
EndProcedure

Repeat : Schreibe()
    Select WindowEvent()
      Case #PB_EventCloseWindow
            End
    EndSelect
;Delay(3)
ForEver 
End
sunset
Beiträge: 10
Registriert: 31.08.2004 12:24

Beitrag von sunset »

Ich habe das selbe Problem gehabt und einfach eine Abfrage eingebaut, die bei einer bereits vorhandenen Datei den Wert jeweils um eine Sekunde senkt, bis ein freier 'Platz' gefunden ist.

Das ist dann m.E. die einfachste Lösung.


Frank
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@All: Vielen Dank für Eure schnelle Hilfe :allright:

Grüße ... Kiffi
Antworten