stoner
Goto Top

Zeit aus Sekunden berechnen

Ahoi zusammen,

ich lese aus verschiedenen Dateien bestimmte Felder aus und spiele diese in eine Datenbank ein (automatisiert alle 10 minuten).
Mein Problem ist, dass diese Dateien aus verschiedenen Quellen stammen, somit sind auch die Felder z.T. unterschiedlich.

Speziell ein Feld macht Probleme:
In der 1. Datei ist dieses Feld in Time Format angegeben, z.B. "00:03:12" für 3 minuten und 12 Sekunden,
in der 2. Datei steht die Zeit im Sekunden Format : "000192".

nun sollte ich das Format der 2. in das Time Format der ersten umwandeln da beide Dateien in die gleiche Tabelle eingelesen werden, das Feld steht als Parameter %t% bereit.

Ich habe die letzten Tage das Web nach einer Lösung durchsucht jedoch ohne ein Ergebnis. Am besten wäre eine Lösung als reine bat, mit nem freeware (command Line) tool oder ne vbs wäre auch kein Prob.

besten Dank schon mal,

Frank

Content-Key: 39244

Url: https://administrator.de/contentid/39244

Ausgedruckt am: 29.03.2024 um 11:03 Uhr

Mitglied: Biber
Biber 03.09.2006 um 01:35:45 Uhr
Goto Top
Tja, stoner,

dann werf ich mal als Erster ein kleines Batch-Freewaretool in den Ring.
::--- snipp Secs2TimeFmt.bat
@echo off & setlocal
Call :secsToTimeFmt %1
echo in:[%1] out:[%TimeFmt%]
goto :eof

:secsToTimeFmt
Set /a "hrs=100"  
set /a "Sec=((1%1-1000000)%%60) + 500"  
set /a "min=(1%1-1000000)/60"  
If %min% GEQ 60 set /a "hrs=(%min%/60)+100"  
If %min% GEQ 60 set /a "min=%min%-((%hrs%-100)*60)"  
Set /a "min+=100"  
Set "timefmt=%hrs:~1%:%min:~1%:%sec:~1%"  

Demo am Cmd-Prompt:
$cmd$for %i in (000195 000001 006483) do @Secs2TimeFmt.bat %i
in:[000195] out:[00:03:15]
in:[000001] out:[00:00:01]
in:[006483] out:[01:48:03]

Der Batch selbst ist ja nur zu Demo-Zwecken.
In Deinen tatsächlichen Batch brauchst Du ja nur den Block ":secsToTimeFmt" übernehmen.

Gruß
Biber
Mitglied: stoner
stoner 03.09.2006 um 13:30:56 Uhr
Goto Top
Hallo Biber,

besten Dank wieder mal für deine Hilfe, dass ganze klappt wunderbar, und nachdem ich eine halbe Stunde über die bat gegrübelt habe ist mir auch einiges klar über die Syntax.
Kleine Änderung da Millisekunden als Quellwert:
Set /a "hrs=100"  
Set /a "sec=((1%1-100000)/10%%60) + 500"  
Set /a "min=(1%1-100000)/600"  
If %min% GEQ 60 set /a "hrs=(%min%/60)+100"  
If %min% GEQ 60 set /a "min=%min%-((%hrs%-100)*60)"  
Set /a "min+=100"  
Set "timefmt=%hrs:~1%:%min:~1%:%sec:~1%"  

Soweit klappt alles, nur werden die Werte nicht gerundet, sondern die millisek. abgeschnitten. gibt es eine Möglichkeit den Wert zu runden?
+500 bei den sec, haben die einen bestimmten Grund? klappt mit z.b. 100 auch.

@Biber besten Dank nochmal für deine Hilfe, mittlerweile komm ich immer besser zurecht, eine Frage hät ich noch zur Syntax (zu einem älteren Thema):

Set "zeile=%*" Setzt den kompletten Input in den Parameter zeile
Set zeile=%zeile: =% löscht leerzeichen im Parameter zeile
Set zeile=%zeile:;;=;0;% ersetzt ;; mit ;0; wieder im Parameter zeile

Habe ich den Code richtig interpretiert? Irgendwie ist mir das noch ein bischen schleierhaft mit dem ändern des Parameters zeile mit dem gleichen Parameternamen. Ebenso mit dem Syntax der Parameter innerhalb der %-Zeichen.

Schönen Sonntag noch,

stoner
Mitglied: Biber
Biber 03.09.2006 um 13:59:13 Uhr
Goto Top
Moin stoner,
und nachdem ich eine halbe Stunde über die bat gegrübelt habe ist mir auch einiges klar über die Syntax
So war es gedacht ... ich hab auch bewusst mit Kommentaren gegeizt gestern.
Denn ohne Anpassungen wird es nicht gehen, dachte ich, und deshalb musst Du Dich eben mit diesem kryptischen Zeug auseinandersetzen.
eine Frage hät ich noch zur Syntax (zu einem älteren Thema):

Set "zeile=%*" Setzt den kompletten Input in den Parameter zeile
Set zeile=%zeile: =% löscht leerzeichen im Parameter zeile
Set zeile=%zeile:;;=;0;% ersetzt ;; mit ;0; wieder im Parameter zeile

Habe ich den Code richtig interpretiert?
Dreimal JA auf alle Fragen.
Der Platzhalter %* steht für "alle übergebenen Parameter".
Die Zeichen-Ersetzen-Funktion ist halt wirklich so schlicht mit "ersetze Zeichen vor dem Gleichheitszeichen mit Zeichen nach dem Gleichheitszeichen".
Sieht in einigen konkreten Fällen definitiv merkwürdig aus, so z.B. beim Ersetzen von Leerzeichen durch "nichts".
Aber die Funktion tut, was sie verspricht.

+500 bei den sec, haben die einen bestimmten Grund? klappt mit z.b. 100 auch.
Okay, das war nur ein Verständnistest. Hast bestanden. face-wink
Geht natürlich auch mit 100 oder 400 oder 11100...
Ist nur zur Verhinderung von Zahlenwerten wie "07" , "08", "09" , die von Buggybuggybuggy-CMD als Oktal interpretiert werden.
Und bei "Set /a sec=09" würde es knallen:
Z:\>
$cmd$set /a sec=09
Ungültige Zahl. Nummerische Konstanten sind entweder dezimale (17),
hexadezimale (0x11) oder oktale (021) Zahlen.
Deshalb "rechne" ich eigentlich immer mit Zahlen größer 100.... und nehme dann für die Anzeige die letzten beiden Ziffern.
Oben in meinem Batch-Schnipsel wäre es auch richtiger so gewesen:
..
Set /a "sec=((1%1-100000)/10%%60) + 500"        && REM wichtig hier nur: es soll ein dreistelliger Wert rauskommen, deshalb +500  
...
Set "timefmt=%hrs:~-2%:%min:~-2%:%sec:~-2%"  
...also lieber jeweils die letzten 2 Zeichen als die Zeichen ab Zeichen 2... (da hatte ich geschlampt *gg)

Soweit klappt alles, nur werden die Werte nicht gerundet, sondern die millisek. abgeschnitten. gibt es eine Möglichkeit den Wert zu runden?
Jein... runden direkt nicht.
Aber wenn es wichtig ist, dann folgende Strategie (angenommen, ich hätte 1788 Millisekunden):
$cmd$set /a sec=1788/100
17   --------------> was ja abgeschnitten wäre
$cmd$set /a msec=1788%100
88 ----> alles, was nach dem zukünftigen Komma bei Sek steht
....und wenn dieser Wert größer ist als 50, dann eine Sekunde draufpacken.

Im Batch sinngemäß:
...
REM sagen wir mal, Parameter 1 sind die 1788 Millisecs
set /a "sec=%1/100"  
REM 17   --------------> was ja abgeschnitten wäre
set /a msec=%1%%100
REM msecs sind 88 ----> alles, was nach dem zukünftigen Komma bei Sek steht; 
REM der Modulo-Operator wird im Batch als "%%" geschrieben!  
REM ....und wenn dieser Wert größer ist als 50, dann eine Sekunde draufpacken.
IF %msecs% GTR 50 set /a "secs+=1"  

Dir auch schönen Restsonntag
Biber
Mitglied: stoner
stoner 03.09.2006 um 17:40:13 Uhr
Goto Top
Hallo Biber,

besten Dank, dein letztes Posting hat mir die Augen geöffnet, schön langsam wird mir klar was da in meiner bat vor sich geht face-wink , sind ja mittlerweile auch schon 100 zeilen code.
Ich habe das mit den 1/10 Sekunden (nicht ms) folgendermassen gelöst:

::Rufdauer in das Time Format ändern (1/10s)
Set /a "ehrs=100"  
Set /a "esec=((1%e%-1000)/10%%60) + 500"  
Set /a "emin=(1%e%-1000)/600"  
Set /a "emsec=(1%e%-1000)%%10"  
If %emsec% GEQ 5 set /a "esec=%esec%+1"  
If %emin% GEQ 60 set /a "ehrs=(%emin%/60)+100"  
If %emin% GEQ 60 set /a "emin=%emin%-((%hrs%-100)*60)"  

Besten Dank nochmal,

stoner
Mitglied: Biber
Biber 03.09.2006 um 19:08:25 Uhr
Goto Top
Jepp, stoner,

ich sehe, Du hast es verstanden.
Sieht gut aus face-wink

Und ob es nun Zehntel-, Hundertstel- oder Tausendstelsekunden sind, das ändert ja nichts an der Mimik.

Ich setze den Beitrag mal auf gelöst, lass ihn aber offen.
Vielleicht wird ja noch eine *.vbs-Variante oder ein anderer Algorithmus gepostet.

Schönen Abend
Biber