axel-the-smoker
Goto Top

Uhrzeit differenz in der XP Kommandozeile berechnen

hallo,

ich habe in 2 Dateien 2 verschiedene uhrzeiten, die sich gelegentlich ändern, wie kann ich die differenz der beiden zeiten herausfinden und an eine 3. zeit addieren?

beispiel:

time.txt enthält 10:00:00
zeit1=10:00:00
time2.txt enthält 11:03:33
zeit2=11:03:33

differenz wären hier 01:03:33


timenow.txt enthält 20:00:00
zeit3=20:00:00
neue zeit3=zeit3+differenz
zeit3=21:03:33

kann es jemand nachvollziehen? ich würde das problem gern in der XP kommandozeile lösen.
könnte man den Beitrag zu meinem problem umeditieren?


mfg
Axel

Content-Key: 58993

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: Biber
Biber May 14, 2007 at 20:34:41 (UTC)
Goto Top
Moin Axel-the.Smoker,

willkommen im Forum.

Nachvollziehen kann ich Dein Ansinnen schon, aber ich kann noch nicht so genau erkennen, wo die Schwierigkeiten liegen.

Die Mimik ist, da Batch keine Zeit-Rechnung unterstützt, doch schon vorgegeben.
Du musst den Stunden-Minuten-Sekunden-String "umrechnen" in Sekunden, dann kannst mit absoluten Werten [Sekunden seit Mitternacht oder auch Sekunden seit Silvester] Differenzen oder Summen bilden.

Vielleicht macht es eine Quick & Dirty-Variation des Themas von damals, dass Du ja schon gefunden hast, klar:
::---ShowTime.bat Biber 2007 Sinnfreier Batch zur Demo Zeitdaueranzeige im Batch
@echo off & setlocal
Set zeit1=10:00:00
Set zeit2=11:03:33
:: den lassen wir für später...Set zeit3=20:00:00
for /f "tokens=1-3 delims=:," %%i in ("%zeit1%") do set /a start=%%i*3600+60*(1%%j %% 100)+1%%k-100  
REM Variable %Start% hat jetzt einen in Sekunden umgerechneten %time%-Wert.

for /f "tokens=1-3 delims=:," %%i in ("%zeit2%") do set /a stop=%%i*3600+60*(1%%j %% 100)+1%%k-100  
REM Auch Variable %Stop% hat jetzt einen in Sekunden umgerechneten %time%-Wert.

Set /a DauerinStd=(stop-start) / 3600
Set /a DauerInMin=(stop-start-(DauerinStd*3600) ) / 60
Set /a UndRestInSecs= (stop-start) -(DauerinStd*3600)- DauerInMin*60 
@Echo [Unformatiert] Gedauert hat es %dauerinStd%:%dauerInMin%:%UndRestInSecs%
REM Oder formatiert:
Set /a FmtSecs=UndRestInSecs+100
Set /a FmtMins=DauerInMin+100
Set /a FmtStd=DauerInStd+100
@Echo [Formatiert] Gedauert hat es %FmtStd:~-2%:%FmtMins:~-2%:%FmtSecs:~-2%
Am CMD-Prompt:
>e:\schnipsel\Showtime.bat
[Unformatiert] Gedauert hat es 1:3:33
[Formatiert] Gedauert hat es 01:03:33

Ich denke, das Vorkaspern der Addition von Sekundenwerten wäre jetzt auch nicht viel ergiebiger als die Differenzermittlung.

Wo liegt denn die Schwierigkeit (ich bin kein so guter Erklärer)?

Gruss
Biber
Member: Axel-the-Smoker
Axel-the-Smoker May 14, 2007 at 21:51:50 (UTC)
Goto Top
vielen dank für die erste hilfe, ich habe mal weiterentwickelt und angepasst:

set zeit1=10:00:00
set zeit2=11:03:33
set zeit3=20:00:00

for /f "tokens=1-3 delims=:," %%i in ("%zeit1%") do set /a start=%%i*3600+60*(1%%j %%   

100)+1%%k-100

REM Variable %Start% hat jetzt einen in Sekunden umgerechneten %time%-Wert.

for /f "tokens=1-3 delims=:," %%i in ("%zeit2%") do set /a stop=%%i*3600+60*(1%%j %%   

100)+1%%k-100

REM Auch Variable %Stop% hat jetzt einen in Sekunden umgerechneten %time%-Wert.

for /f "tokens=1-3 delims=:," %%i in ("%zeit3%") do set /a timenow=%%i*3600+60*(1%%j   

%% 100)+1%%k-100

REM Auch Variable %timenow% hat jetzt einen in Sekunden umgerechneten %time%-Wert.

Set /a TimeNowinStd=(timenow+stop-start) / 3600
Set /a TimeNowInMin=((timenow+stop-start)-(TimeNowinStd*3600))/60
Set TimeNowInMin
Set /a UndRestInSecs= (timenow+stop-start) -(TimeNowinStd*3600)- TimeNowInMin*60 
Set UndRestInSecs
@Echo [Unformatiert] Uhrzeit: %TimeNowinStd%:%TimeNowInMin%:%UndRestInSecs%
REM Oder formatiert:
Set /a FmtSecs=UndRestInSecs+100
Set /a FmtMins=TimeNowInMin+100
Set /a FmtStd=TimeNowInStd+100
@Echo [Formatiert] Uhrzeit: %FmtStd:~-2%:%FmtMins:~-2%:%FmtSecs:~-2%

es funktioniert fast, nur wenn man über den tageswechsel kommt gibts noch probleme... hat jemand ne idee? habe noch eine variable date die man hochzählen müsste..

set date1=01.01.2007


viele grüße Axel
Member: Biber
Biber May 15, 2007 at 07:18:52 (UTC)
Goto Top
Moin Axel,
jedoch funktioniert es noch nicht 100% ...
Ist ja auch nicht von M$, sondern nur von mir...
.. und nur mit manchen uhrzeiten, ...
Dann gib doch bitte ein paar Beispiele für nicht funktionierende.. ich möchte nicht alle Kombinationen durchprobieren.
....wo könnte der fehler noch liegen?
Zu hohe Luftfeuchtigkeit? Seitenwind? Zu feiner Sand?

Grüße
Biber
Member: bastla
bastla May 15, 2007 at 08:05:05 (UTC)
Goto Top
Hallo Axel-the-Smoker!

Da sich's mit (temporärem) VB-Script etwas leichter rechnet (und formatiert), vielleicht auch noch folgende Variante:
@echo off & setlocal
set "ZeitBer=%temp%\ZeitBer.vbs"  
set zeit1=10:00:00
set zeit2=11:03:33
echo Sec=DateDiff("s",WScript.Arguments(0),WScript.Arguments(1)):Sec=Sec-(Sec^<0)*86400:WScript.Echo FormatDateTime(Sec/86400,3)>"%ZeitBer%"  
for /f "delims=" %%i in ('cscript //nologo "%ZeitBer%" %zeit1% %zeit2%') do set "diff1=%%i"  
for /f "delims=" %%i in ('cscript //nologo "%ZeitBer%" %zeit2% %zeit1%') do set "diff2=%%i"  
for /f "tokens=1-3 delims=:" %%i in ('cscript //nologo "%ZeitBer%" %zeit1% %zeit2%') do set /a diffStd=%%i & set /a diffMin=%%j & set /a diffSek=%%k  
del "%ZeitBer%"  
set diff
Die Übergabe der Zeitwerte erfolgt nach dem Schema "von" - "bis", oder anders formuliert: Der zuerst übergebene Wert wird vom zweiten Wert abgezogen (siehe Beispiele oben).

Grüße
bastla

P.S.: Ich bin eher toler- als militant, und antworte daher auch Rauchern ... face-wink
Member: Axel-the-Smoker
Axel-the-Smoker May 15, 2007 at 12:34:36 (UTC)
Goto Top
Ist ja auch nicht von M$, sondern nur von
mir...
> ....wo könnte der fehler noch
liegen?
Zu hohe Luftfeuchtigkeit? Seitenwind? Zu
feiner Sand?

ich verlange doch keine funktionsgaratie face-smile aber ich glaube es liegt am getriebesand, der blaue ist nicht so gut wie der rote!
aber ernsthaft: das mit den "fast 100%" hat sich gegeben, eine von mir geänderte variable hatte nen rechtschreibfehler. ich habe den obigen beitrag schon korrigiert! nur das tagübergeben steht noch an.... ich werde mal probieren vielleicht habt ihr ja eine idee

hier ein schema

date1=01.01.2007

tag,monat,jahr aus date1 deklarieren

if stunde>23 then
   stunde=stunde-24
   tag=tag+1

   if tag>30 bzw. >31 {das wird schwierig, vorallem beim feb}
      tag=tag-30 bzw. -31
      monat=monat+1

      if monat>12
         monat=monat-12  
         jahr=jahr+1

      end
   end
end



mfg
Axel

PS: @bastla auch vielen dank an Deine umsetzung, vielleicht kann ich daraus meine formeln noch weiter optimieren, und der Nick ist noch aus alten zeiten, bin nichtraucher *smile*
Member: Biber
Biber May 15, 2007 at 16:30:54 (UTC)
Goto Top
@axel-the-ex-smoker

hier ein schema..
In die Tonne damit.
Mach es nicht so kompliziert.
ich habe es oben schon geschrieben (oder zumindest gedacht):

Für Quick-und-Dirty, also Zeitberechnungen von-bis im Minuten/Stundenbereich
---> mit Sekunden seit Mitternacht als Basis recnnen.

Für mehr Robustheit: umrechnen auf Sekunden seit Silvester. Oder seit 1.1.1970.
Oder Einführung des Vatertags.

Spricht doch nichts dagegen, wenn da größere Sekundenzahlen addiert/subtrahiert werden.

Gruß
Biber
Member: Axel-the-Smoker
Axel-the-Smoker May 15, 2007 at 20:37:38 (UTC)
Goto Top
ich habe es oben schon geschrieben (oder
zumindest gedacht):


?? wo? quick and dirty schon? auf jeden fall bleibt für mich die frage wie ich den zeitlichen übertrag aufs datum bekomme face-sad

mfg
Axel