dasilva
Goto Top

Internationales Datum und Zeitzone bestimmen

Hilfe bei kleinem Batchscript benötigt.

Ich möchte in eine Datei das Datum inkl. Wochentag und Uhrzeit schreiben.
Die deutsche Version ist auch fertig, nur die englische bereitet mir noch Probleme.
Wie kann ich das Datum als MM-TT-YYYY statt TT.MM.YYYY ausgeben lassen ohne die Tastatur oder sonstige Regionaleinstellungen zu ändern?
Der bisherige Code sieht so aus:

FOR /F "tokens=1,2,3 delims=." %%a in ('echo %date%') do set yy=%%c & set mm=%%b & set dd=%%a  

set /a "TwoDigitYearMax=2038%%1000"  
if 1%yy% LSS 200 if 1%yy% LSS 1%TwoDigitYearMax% (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a zDe=14-mm,zDe/=12,y=yy+4800-zDe,m=mm+12*zDe-3,dowDe=153*m+2
set /a dowDe=dowDe/5+dd+y*365+y/4-y/100+y/400-2472630,dowDe%%=7,dowDe+=1
set /a zEn=14-mm,zEn/=12,y=yy+4800-zEn,m=mm+12*zEn-3,dowEn=153*m+2
set /a dowEn=dowEn/5+dd+y*365+y/4-y/100+y/400-2472630,dowEn%%=7,dowEn+=1

If %dowDe% equ 1 set "WoTaDe=Montag"  
If %dowDe% equ 2 set "WoTaDe=Dienstag"  
If %dowDe% equ 3 set "WoTaDe=Mittwoch"  
If %dowDe% equ 4 set "WoTaDe=Donnerstag"  
If %dowDe% equ 5 set "WoTaDe=Freitag"  
If %dowDe% equ 6 set "WoTaDe=Samstag"  
If %dowDe% equ 7 set "WoTaDe=Sonntag"  
If %dowEn% equ 1 set "WoTaEn=Monday"  
If %dowEn% equ 2 set "WoTaEn=Tuesday"  
If %dowEn% equ 3 set "WoTaEn=Wednesday"  
If %dowEn% equ 4 set "WoTaEn=Thursday"  
If %dowEn% equ 5 set "WoTaEn=Friday"  
If %dowEn% equ 6 set "WoTaEn=Saturday"  
If %dowEn% equ 7 set "WoTaEn=Sunday"  

rem // Erstellt zeit.cfg + gibt das aktuelle Datum und die aktuelle Zeit an.
echo say Es ist %WoTaDe%, der %date% um %time:~0,8% Uhr in Deutschland > ZeitDe.cfg 
echo say It ist %WoTaEn%, the %date% at %time:~0,8% clock in Germany > ZeitEn.cfg 

Ergebnis:

say Es ist Sonntag, der 15.06.2008 um 1:01:38 Uhr in Deutschland  
say It ist Sunday, the 15.06.2008 at 1:01:38 clock in Germany  

Zusätzlich sollte auch die Zeit im zwölf Stunden Format angezeigt werden (geht immer nur um die ZeitEn.cfg) und würde man das im Englischen überhaupt so formulieren?
Als letzter Punkt wäre noch interessant wenn UTC+1 oder UTC+2 angegeben werden kann, je nachdem ob gerade Sommerzeit herrscht oder nicht.

Danke für Hilfe.
Kommentar vom Moderator Biber am 24.03.2010 um 20:28:24 Uhr
Habe diesen Beitrag heute auf "gelöst" gesetzt.
Eigentlich ist das ja fast ein Teil 4 des "Batch for Runaways"-Wokshops geworden... der sollte auch auf "benutzer.de" sichtbar sein.

Content-ID: 90078

Url: https://administrator.de/forum/internationales-datum-und-zeitzone-bestimmen-90078.html

Ausgedruckt am: 26.12.2024 um 19:12 Uhr

Biber
Biber 19.06.2008 um 00:26:26 Uhr
Goto Top
Moin DaSilva,

Rückfragen:
  • soll das Skript nur auf deinem Rechner laufen oder auf "beliebigen"?
  • falls "beliebig": Betriebssystem W2K/XP/Vista und mal als DE, mal als US-Version?
  • WhoThe... wer bitte erwartet von Dir die Info, ob auf dem Rechner automatisch Sommerzeit angezeigt wird???? Wo das in der Registry steht, weiß außerhalb von Redmond eine Handvoll Spinner Entwickler.

[Zu 1 und 2: In deinem Skriptchen gehst Du ja davon aus, dass das deutsche XP-Datumsformat gegeben ist; bei W2000 oder bei englischem Datumsformat würde die %date%-Auswertung ja nicht laufen.]

Grüße
Biber
DaSilva
DaSilva 19.06.2008 um 00:51:54 Uhr
Goto Top
Erstmal würde es auf meinem Rechner (Vista DE) reichen. Universell wäre aber nett.

Falls man die Zeitzone nicht irgendwo heraus bekommt, gibt es keine Abfrage?

"Derzeit beginnt die mitteleuropäische Sommerzeit jeweils am letzten Sonntag im März um 2 Uhr mitteleuropäischer Zeit. Zum Zeitpunkt des Beginns der Sommerzeit wird die Stundenzählung um eine Stunde von 2 Uhr auf 3 Uhr vorgestellt. Die Sommerzeit endet jeweils am letzten Sonntag im Oktober um 3 Uhr mitteleuropäischer Sommerzeit. Zum Zeitpunkt des Endes der Sommerzeit wird die Stundenzählung um eine Stunde von 3 Uhr auf 2 Uhr zurückgestellt."
Biber
Biber 19.06.2008 um 20:38:30 Uhr
Goto Top
Moin DaSilva,

danke Dir für die aufmunternde Sommerzeit-Definition....
Aber leider kann man/frau im Batch keine Datumsberechnungen machen.
Es gibt schlicht und einfach keinen Datentyp "Datum" im CMD-Interpreter.

Siehe oben bei den Verrenkungen, die Du zur Wochentagsberechnung machen musstest.

Also: ich sehe drei oder vier Möglichkeiten:
  • Im obigen Batch das angelsächsische Datumsformat durch Substring-Funktionen bezogen auf die (vermutlichen) TAG und MONAT-Werte hinfrickeln. Wird dann vollkommen irrwitzig, wenn Du diesen Batch dann auf einem EN- oder US-sprachigen W2000-Rechner startest
  • Im Anfang irgendwie das Datum via Utility "sprachunabhängig" ermitteln lasssen. Zum Beispiel das Now.exe aus dem ResKit kann so etwas.
  • oder alles ohne Drittutilities mit Batch/Reg.exe aus/mit der Registry abfackeln.

Was die GMT/UTC-Abweichung/Berechnung betrifft... geht nur entweder über Registry (was ich mir grad noch zutraue) oder über dubiose Win-API-Calls von GetTimeToLocalTime() oder so ähnlich. Was ich nicht freiwillig für eine Benutzer-Display-Meldung anfasse.

Lohnen sich Aufwand und Nutzen?

Grüße
Biber


[Edit Biber 21.06.2008]
Recommended - was wohl nicht so herauskam - ist der Weg über Utilities, "die das können". Z.B. Now.exe aus dem ResKit oder ein Tool wie ShowDate vom geschätzten Forumsmitglied Axel Hahn, s.u. Links in "Batch und Shell".
Alle folgenden Kommentare haben eher Workshop-Charakter und sind nicht unbedingt Empfehlungen für produktive Lösungen.
[/Edit]
DaSilva
DaSilva 20.06.2008 um 17:13:49 Uhr
Goto Top
Hmmm, wahrscheinlich eher nicht ;)
Trotzdem danke.
Biber
Biber 20.06.2008 um 17:31:16 Uhr
Goto Top
Na ja, DaSilva,

ich will ja nicht, dass Du so betrübt ins Wochenende gehst...
Bezüglich der Zeitzonen-Infos hab ich noch mal schnell was zusammengeharkt.

Wenn Du XP/Vista hast und die Reg.exe (ist Standard bei denen) und auf HKLM zugreifen kannst, dann tut es dieser Schnipsel.
@echo off & setlocal
:: optional ....Summertime.... and the living is easy...
:: Geht natürlich nur mit Rechten auf HKLM...
Set regkey="HKLM\System\CurrentControlSet\Control\TimeZoneInformation"  
call :SaveOldValue ActiveTimeBias
call :SaveOldValue DaylightBias
call :SaveOldValue StandardName
call :SaveOldValue DaylightName
call :SaveOldValue Bias
If defined old_Bias             Set /a GMTdiff= %old_Bias% / -60
If defined old_ActiveTimeBias   Set /a Actdiff= %old_ActiveTimeBias% / -60
If defined old_DayLightBias Set /a UTCdiff= %old_DaylightBias% / -60
:: -----------
If defined ActDiff echo Act-Differenz in Stunden plus/minus: [All+%ActDiff%]
if defined old_StandardName Echo Zeitzone: %old_StandardName%
if defined old_DaylightName Echo Sommerzeit: %old_DaylightName%
If defined GMTDiff echo GMT-Differenz in Stunden plus/minus: [GMT+%GMTDiff%]
If defined UTCDiff echo UTC-Differenz in Stunden plus/minus: [UTC+%UTCDiff%]

goto :eof


~~~~~~~~~ [End of bätschelchen]
:SetNewvalue param1=wert param2=value in Anfü-Zeichen
reg add %regkey% /v "%~1" /d "%~2" /f >nul  
goto :eof

:SaveOldValue param1=regValue 
REM Anmerkung: wenn es den Wert nicht gibt oder keine Rechte darauf,
REM dann kommt keine Fehlermeldung, aber die Variable ist nicht definiert.
For /f "tokens=2*" %%i in ('reg query %regkey% /v "%~1" ^2^>nul^|findstr  /i "%~1"') do (  
    set "old_%1=%%j"  
) 
goto :eof

Output:
>e:\schnipsel\GetTimezones.cmd
Act-Differenz in Stunden plus/minus: [All+2]
Zeitzone: Westeuropäische Normalzeit
Sommerzeit: Westeuropäische Normalzeit
GMT-Differenz in Stunden plus/minus: [GMT+1]
UTC-Differenz in Stunden plus/minus: [UTC+1]

... wobei, wenn ich die Registry-Werte richtig interpretiere dort für meinen Rechner herauskommen müsste, dass er momentan 1 Stunde zur GMT-Zeit versetzt + 1 Stunde wg. Sommerzeit vorgestellt ist, also [Zeile Act-Differenz] alles in Allem +2 Std Differenz vorzuweisen hat.

Grüße
Biber
DaSilva
DaSilva 20.06.2008 um 18:15:53 Uhr
Goto Top
Waoh, danke.
Das mit der englischen Zeitangabe ist auf einem deutschen System wohl nicht möglich!?
Biber
Biber 20.06.2008 um 18:38:04 Uhr
Goto Top
Moin DaSilva,

natürlich ist es möglich... alles außer Brotschneiden geht per Batch.

Nur die Strategie ist die Frage - siehe oben, wo ich mich über mögliche Wege ausgelassen habe.

Das Datumsermittlung im Windows-Batch ist ja nicht nur zwei-, sondern eher schon dreischneidig.

  • Erstens kennt die CMD.exe keine Datums-Arithmetik. Alles ist "Text".
  • Zweitens bekommst Du, wenn Du am CMD-Prompt nach Datum und Zeit fragst, irgendetwas menschenlesbares (mit/ohne Wochentag abgekürzt oder ausgeschrieben, in der Reihenfolge TTMMJJJJ oder MM/DD/YYYY oder als YYYY-MM-DD... ) und Du weißt nicht was Du bekommst
  • Drittens ist diese ganze "Regions- und Spracheinstellung"-Arie so dermaßen zusammengeschlampert von den redmonder Praktikanten, dass ich mittlerweile auch so wesentlich brutaleren Methoden bei der Datumsermittlung greife als M$ sich trauen würde.

In meinem Workshop "Batch for Runaways III" (siehe unten unter mögliche Anleitungen) hatte ich noch geschrieben, ich muss halt das "unstruktierte" und beliebige Datums/Zeitformat normalisieren, das mir vom Tisch des sympathischen Weltmarktführers in den Schoß bzw. in den Batch fällt

Shice drauf. Sehe ich lockerer inzwischen.
Jetzt schiesse ich halt das Datumsformat selber per Registry um und bekomme dann Tage, Monate, Jahre und auch Wochentage wann und wo ich will.
Und hinterher stelle ich den alten Zustand wieder her.

Beispiel.
:: -----------Snipp GetEnDeCfg.cmd
:: Biber 2008 als Fussnote zum Workshop Batch 4 Runaways III" 
::  "Umgang mit Datums- und Zeitvariablen im Batch" 
@echo off & setlocal
REM Achtung: Unter W2000 _kein_ Fehler, aber auch kein sichtbarer Effekt
REM Die sofortige Nutzbarkeit der neuen Date/t und Time/t-Reg-Settings erst ab XP

set regkey="HKEY_CURRENT_USER\Control Panel\International"  
call :SaveOldValue sShortdate
call :SaveOldValue s1159
call :SaveOldValue s2359
call :SaveOldValue sTimeFormat
REM unused call :SaveOldValue iDate
REM unused call :SaveOldValue iTime
For %%i in (sShortDate s1159 s2359 sTimeformat) do @(
       if not defined old_%%i ( 
          @echo Fehler: %regkey% value "%%i" nicht gefunden  
          pause 
          goto :eof
       )   
)

:: set old_  <--- uncomment here for debug
:: würde diese nächsten Zeilen anzeigen
:: old_sShortdate=dd.MM.yyyy
:: old_iDate=1
:: old_s1159=AM
:: old_s2359=PM
:: old_sTimeFormat=HH:mm:ss


:: Originaldatum/zeit sichern
For /f "delims=" %%i in ('time/t') do set "xyTime=%%i"  
For /f "delims=" %%i in ('date/t') do set "xyDate=%%i"  

:: mal M$ einen freundlichen Gruß senden :-P
:: ..."coden wie ein Redmonder" ....muahaha... 
call :SetNewValue   sShortdate "ddd"  
For /f %%i in ('date/t') do set "WoTach=%%i"  
:: na...mitbekommen, was ich eben gemacht habe??


If "%WoTach%" equ "Mo" set "WoTaDe=Montag"     & set "WoTaEn=Monday"   
If "%WoTach%" equ "Di" set "WoTaDe=Dienstag"   & set "WoTaEn=Tuesday"  
If "%WoTach%" equ "Mi" set "WoTaDe=Mittwoch"   & set "WoTaEn=Wednesday"  
If "%WoTach%" equ "Do" set "WoTaDe=Donnerstag" & set "WoTaEn=Thursday"  
If "%WoTach%" equ "Fr" set "WoTaDe=Freitag"    & set "WoTaEn=Friday"  
If "%WoTach%" equ "Sa" set "WoTaDe=Samstag"    & set "WoTaEn=Saturday"  
If "%WoTach%" equ "So" set "WoTaDe=Sonntag"    & set "WoTaEn=Sunday"  
if defined WoTaDe goto :allesEasy
If "%WoTach%" equ "Mon" set "WoTaDe=Montag"     & set "WoTaEn=Monday"   
If "%WoTach%" equ "Thu" set "WoTaDe=Dienstag"   & set "WoTaEn=Tuesday"  
If "%WoTach%" equ "Wed" set "WoTaDe=Mittwoch"   & set "WoTaEn=Wednesday"  
If "%WoTach%" equ "Thu" set "WoTaDe=Donnerstag" & set "WoTaEn=Thursday"  
If "%WoTach%" equ "Fri" set "WoTaDe=Freitag"    & set "WoTaEn=Friday"  
If "%WoTach%" equ "Sat" set "WoTaDe=Samstag"    & set "WoTaEn=Saturday"  
If "%WoTach%" equ "Sun" set "WoTaDe=Sonntag"    & set "WoTaEn=Sunday"  
:allesEasy

:: auf deutsches XP-Date-Format setzen
:: unused call :SetNewValue    iDate
call :SetNewValue   sShortdate "dd.MM.yyyy"  
call :SetNewValue   s1159 ""  
call :SetNewValue   s2359 ""  
call :SetNewValue   sTimeFormat "HH:mm:ss"  

For /f "delims=" %%i in ('time/t') do set "deTime=%%i"  
For /f "delims=" %%i in ('date/t') do set "deDate=%%i"  

:; auf amerkanisches Date-Format setzen
:: unused call :SetNewValue    iDate
call :SetNewValue   sShortdate "MM-dd-yyyy"  
call :SetNewValue   s1159 "AM"  
call :SetNewValue   s2359 "PM"  
call :SetNewValue   sTimeFormat "hh:mm:ss tt"  

For /f "delims=" %%i in ('time/t') do set "enTime=%%i"  
For /f "delims=" %%i in ('date/t') do set "enDate=%%i"  

REM unused call :SetNewValue    iDate
call :SetNewValue  s1159 "%old_s1159%"  
call :SetNewValue  s2359 "%old_s2359%"  
call :SetNewValue  sTimeFormat "%old_sTimeFormat%"  
call :SetNewValue  sShortdate "%old_sShortDate%"  

:: optional ....Summertime.... and the living is easy...
:: Geht natürlich nur mit Rechten auf HKLM...
Set regkey="HKLM\System\CurrentControlSet\Control\TimeZoneInformation"  
call :SaveOldValue ActiveTimeBias
call :SaveOldValue DaylightBias
call :SaveOldValue StandardName
call :SaveOldValue DaylightName
call :SaveOldValue Bias
If defined old_Bias             Set /a GMTdiff= %old_Bias% / -60
If defined old_ActiveTimeBias   Set /a Actdiff= %old_ActiveTimeBias% / -60
If defined old_DayLightBias Set /a UTCdiff= %old_DaylightBias% / -60
:: -----------
Echo xyDate [xyTime]: %xyDate% [%xytime%]
Echo deDate [deTime]: %deDate% [%detime%]
Echo enDate [entime]: %enDate% [%entime%]
Echo WoTach: [%WoTach%] WoTaDe [%WoTaDe%] WoTaEn: [%WotaEn%]
If defined ActDiff echo Act-Differenz in Stunden plus/minus: [All+%ActDiff%]
if defined old_StandardName Echo Zeitzone: %old_StandardName%
if defined old_DaylightName Echo Sommerzeit: %old_DaylightName%
If defined GMTDiff echo GMT-Differenz in Stunden plus/minus: [GMT+%GMTDiff%]
If defined UTCDiff echo UTC-Differenz in Stunden plus/minus: [UTC+%UTCDiff%]
echo\
Echo @DaSilva:
echo say Heute ist %WoTach%, der %xyDate% um %xytime% in XY-Land
echo say Heute ist %WoTaDe%, der %deDate% um %time% Uhr in Deutschland
echo say Today is %WoTaEn%, %endate% %EnTime% in Germany

goto :eof


~~~~~~~~~ [End of bätschelchen]
:SetNewvalue param1=wert param2=value in Anfü-Zeichen
If %2=="""" (   
   reg add %regkey% /v "%~1" /f >nul  
) else (   
reg add %regkey% /v "%~1" /d "%~2" /f >nul  
)
goto :eof

:SaveOldValue param1=regValue 
For /f "tokens=2*" %%i in ('reg query %regkey% /v "%~1" ^2^>nul^|findstr  /i "%~1"') do (  
    If "%%j" Equ "" (set old_%1="") else set "old_%1=%%j"  
) 
goto :eof
Output dieses Schnipsels:
>e:\schnipsel\GetEnDeCfg.cmd
xyDate [xyTime]: 20.06.08  [18:33]
deDate [deTime]: 20.06.2008  [18:33]
enDate [entime]: 06-20-2008  [06:33 PM]
WoTach: [Fr] WoTaDe [Freitag] WoTaEn: [Friday]
Act-Differenz in Stunden plus/minus: [All+2]
Zeitzone: Westeuropõische Normalzeit
Sommerzeit: Westeuropõische Normalzeit
GMT-Differenz in Stunden plus/minus: [GMT+1]
UTC-Differenz in Stunden plus/minus: [UTC+1]

@DaSilva:
say Heute ist Fr, der 20.06.08  um 18:33 in XY-Land
say Heute ist Freitag, der 20.06.2008  um 18:33:56,25 Uhr in Deutschland
say Today is Friday, 06-20-2008  06:33 PM in Germany
[--vorsichtig testen und nicht blind verkaufen-- ist nur schnell zusammengeschrotet]

Die ganze Wochentagsberechnung z.B spar ich mit, indem ich einfach das datums-Anzeigeformat auf "ddd" setze statt das "dd.MM.yyyy" hinzunehmen.
Siehe in Zeile 33ff.
So bekomme ich bei einem "date /t" die Ausgabe "Fr"... *g

Aber ich gebe zu, dass so ein Vorgehen natürlich kein Professionelles ist.
...kann auch gut damit leben....

Grüße
Biber
[Edit] Umgang mit vorhandenen {leeren} Registry-Werten geändert - setNewValue/SaveOldValue angepasst. Siehe unten. [/Edit]
DaSilva
DaSilva 20.06.2008 um 19:17:01 Uhr
Goto Top
Das ist unglaublich!
Leider bekomme ich folgende Fehlermeldung:

Fehler: "HKEY_CURRENT_USER\Control Panel\International" value "s1159" nicht gefunden

Kann das an Vista liegen?
Biber
Biber 20.06.2008 um 22:58:23 Uhr
Goto Top
Moin DaSilva,

Kann das an Vista liegen?
Teils, teils.
Dass diese Fehlermeldung kommt, "ist ein beabsichtigtes Verhalten" (um eine bekannte Redmonder Softwareklitsche zu zitieren). Works as designed, wie wir Biber sagen.

Oben im Schnipsel kannst Du nachverfolgen, dass ich natürlich erst versuche, die vorhandenen HKCU-Werte des Users zu lesen und zu sichern, bevor ich sie mit irgendeinem Dreck überschreibe.
Wenn es die Werte nicht gibt, steigt das Skript (kontrolliert) aus.
Den Schlüssel "sShortDate", in dem so etwas wie "dd.MM.yyyy" bei Dir stehen wird, den hat er gefunden.
Die beiden Werte "s1159" und "s2359" sind bei Dir wohl nicht definiert, weil Du -trotz Deiner Anglophilie- noch nie mit Us-Datumsformat gearbeitet an diesem Rechner.
--> definiere sie einfach. Liest /interpretiert außer meinem Skript ja keiner.

Bitte an den CMD-Prompt:
set regkey="HKEY_CURRENT_USER\Control Panel\International"   
reg add %regkey% /v s1159 /d "vm"  
reg add %regkey% /v s2359 /d "nm"  
"vm" für vormittach, "nm" für nachmMittach
Oder jeweils auf "". (Leerstring)
-->vollkommen wurscht, sieht keiner.
Die bei Dir vorhandenen Werte solltest Du Dir am besten einmal anzeigen und kopieren:
reg query %regkey% /s
Dann schauen wir weiter.

Grüße
Biber
DaSilva
DaSilva 20.06.2008 um 23:53:06 Uhr
Goto Top
Danke, jetzt hat alles geklappt.
Hier ist das an meine Bedürfnisse angepasste Script:

:: -----------Snipp GetEnDeCfg.cmd
:: Biber 2008 als Fussnote zum Workshop Batch 4 Runaways III" 
::  "Umgang mit Datums- und Zeitvariablen im Batch" 
@echo off & setlocal
REM Die nächsten drei Zeilen aktivieren ("REM" entfernen) wenn Fehler mit Registry auftritt  
REM set regkey="HKEY_CURRENT_USER\Control Panel\International"   
REM reg add %regkey% /v s1159 /d "vm"  
REM reg add %regkey% /v s2359 /d "nm"  
set regkey="HKEY_CURRENT_USER\Control Panel\International"  
call :SaveOldValue sShortdate
call :SaveOldValue s1159
call :SaveOldValue s2359
call :SaveOldValue sTimeFormat
REM unused call :SaveOldValue iDate
REM unused call :SaveOldValue iTime
For %%i in (sShortDate s1159 s2359 sTimeformat) do @(
       if not defined old_%%i ( 
          @echo Fehler: %regkey% value "%%i" nicht gefunden  
          pause 
          goto :eof
       )   
)

:: set old_  <--- uncomment here for debug
:: würde diese nächsten Zeilen anzeigen
:: old_sShortdate=dd.MM.yyyy
:: old_iDate=1
:: old_s1159=AM
:: old_s2359=PM
:: old_sTimeFormat=HH:mm:ss


:: Originaldatum/zeit sichern
For /f "delims=" %%i in ('time/t') do set "xyTime=%%i"  
For /f "delims=" %%i in ('date/t') do set "xyDate=%%i"  

:: mal M$ einen freundlichen Gruß senden :-P
:: ..."coden wie ein Redmonder" ....muahaha... 
call :SetNewValue   sShortdate "ddd"  
For /f %%i in ('date/t') do set "WoTach=%%i"  
:: na...mitbekommen, was ich eben gemacht habe??


If "%WoTach%" equ "Mo" set "WoTaDe=Montag"     & set "WoTaEn=Monday"   
If "%WoTach%" equ "Di" set "WoTaDe=Dienstag"   & set "WoTaEn=Tuesday"  
If "%WoTach%" equ "Mi" set "WoTaDe=Mittwoch"   & set "WoTaEn=Wednesday"  
If "%WoTach%" equ "Do" set "WoTaDe=Donnerstag" & set "WoTaEn=Thursday"  
If "%WoTach%" equ "Fr" set "WoTaDe=Freitag"    & set "WoTaEn=Friday"  
If "%WoTach%" equ "Sa" set "WoTaDe=Samstag"    & set "WoTaEn=Saturday"  
If "%WoTach%" equ "So" set "WoTaDe=Sonntag"    & set "WoTaEn=Sunday"  
if defined WoTaDe goto :allesEasy
If "%WoTach%" equ "Mon" set "WoTaDe=Montag"     & set "WoTaEn=Monday"   
If "%WoTach%" equ "Thu" set "WoTaDe=Dienstag"   & set "WoTaEn=Tuesday"  
If "%WoTach%" equ "Wed" set "WoTaDe=Mittwoch"   & set "WoTaEn=Wednesday"  
If "%WoTach%" equ "Thu" set "WoTaDe=Donnerstag" & set "WoTaEn=Thursday"  
If "%WoTach%" equ "Fri" set "WoTaDe=Freitag"    & set "WoTaEn=Friday"  
If "%WoTach%" equ "Sat" set "WoTaDe=Samstag"    & set "WoTaEn=Saturday"  
If "%WoTach%" equ "Sun" set "WoTaDe=Sonntag"    & set "WoTaEn=Sunday"  
:allesEasy

:: auf deutsches XP-Date-Format setzen
:: unused call :SetNewValue    iDate
call :SetNewValue   sShortdate "dd.MM.yyyy"  
call :SetNewValue   s1159 ""  
call :SetNewValue   s2359 ""  
call :SetNewValue   sTimeFormat "HH:mm:ss"  

For /f "delims=" %%i in ('time/t') do set "deTime=%%i"  
For /f "delims=" %%i in ('date/t') do set "deDate=%%i"  

:; auf amerkanisches Date-Format setzen
:: unused call :SetNewValue    iDate
call :SetNewValue   sShortdate "MM-dd-yyyy"  
call :SetNewValue   s1159 "AM"  
call :SetNewValue   s2359 "PM"  
call :SetNewValue   sTimeFormat "hh:mm:ss tt"  

For /f "delims=" %%i in ('time/t') do set "enTime=%%i"  
For /f "delims=" %%i in ('date/t') do set "enDate=%%i"  

REM unused call :SetNewValue    iDate
call :SetNewValue  s1159 "%old_s1159%"  
call :SetNewValue  s2359 "%old_s2359%"  
call :SetNewValue  sTimeFormat "%old_sTimeFormat%"  
call :SetNewValue  sShortdate "%old_sShortDate%"  

:: optional ....Summertime.... and the living is easy...
:: Geht natürlich nur mit Rechten auf HKLM...
Set regkey="HKLM\System\CurrentControlSet\Control\TimeZoneInformation"  
call :SaveOldValue ActiveTimeBias
call :SaveOldValue DaylightBias
call :SaveOldValue StandardName
call :SaveOldValue DaylightName
call :SaveOldValue Bias
If defined old_Bias             Set /a GMTdiff= %old_Bias% / -60
If defined old_ActiveTimeBias   Set /a Actdiff= %old_ActiveTimeBias% / -60
If defined old_DayLightBias Set /a UTCdiff= %old_DaylightBias% / -60
:: -----------
:loop
REM Echo xyDate [xyTime]: %xyDate% [%xytime%]
REM Echo deDate [deTime]: %deDate% [%detime%]
REM Echo enDate [entime]: %enDate% [%entime%]
REM Echo WoTach: [%WoTach%] WoTaDe [%WoTaDe%] WoTaEn: [%WotaEn%]
If defined ActDiff REM echo Act-Differenz in Stunden plus/minus: [All+%ActDiff%]
if defined old_StandardName REM Echo Zeitzone: %old_StandardName%
if defined old_DaylightName REM Echo Sommerzeit: %old_DaylightName%
If defined GMTDiff REM echo GMT-Differenz in Stunden plus/minus: [GMT+%GMTDiff%]
If defined UTCDiff REM echo UTC-Differenz in Stunden plus/minus: [UTC+%UTCDiff%]
REM echo\
REM Echo @DaSilva:
REM echo say Heute ist %WoTach%, der %xyDate% um %xytime% in XY-Land
echo say Heute ist %WoTaDe%, der %deDate%um %time:~0,8% Uhr (UTC+%ActDiff%) > ZeitDe.cfg
echo say Today is %WoTaEn%, the %endate%at %EnTime% (UTC+%ActDiff%) > ZeitEn.cfg 
goto display_text

rem // Zeigt das Datum und die Zeit in DOS Fenster an.
:display_text
cls
echo DaSilva Time Script 1.5 activated. Aktuelle Zeit: %WoTaDe%, der %date% %time:~0,8% (UTC+%ActDiff%)
sleep 1 
rem // hier kannst du die zeitspanne ändern die das script aktualisiert werden soll (1 = 1 Sekunde, 60 = 60 Sekunden)
goto loop

goto :eof


~~~~~~~~~ [End of bätschelchen]
:SetNewvalue param1=wert param2=value in Anfü-Zeichen
reg add %regkey% /v "%~1" /d "%~2" /f >nul  
goto :eof

:SaveOldValue param1=regValue 
For /f "tokens=2*" %%i in ('reg query %regkey% /v "%~1" ^2^>nul^|findstr  /i "%~1"') do (  
    set "old_%1=%%j"  
) 
goto :eof

Wie du siehst läuft es in einer Endlosschleife da die Zeit sekundengenau in der *.cfg landen soll solange das Script läuft. Ist es schlimm, dass dadurch die letzten Zeilen nicht mehr aufgerufen werden?
Zudem noch eine letzte Frage um mich vollkommen glücklich ins Wochenende zu schicken ;)

1. Ist es möglich bei der englischen Uhrzeit auch die Sekunden mit anzugeben (11:52:11 PM)?

Über eine letzte Optimierung aufgrund dieses Scripts würde ich mich sehr freuen. Danke vielmals! Mehr Kompetenz gibt es wohl nicht in diesem Bereich!
Biber
Biber 21.06.2008 um 01:15:28 Uhr
Goto Top
Moin DaSilva,

zu Deiner Frage "Uhrzeit auch mit Sekunden möglich"...

Ich fürchte: Nein.
Jedenfalls nicht ohne nun doch wieder selbst etwas mit Substr-Funktionen zusammenzustoppeln.

Grund ist diese [Disclaimer: Dies ist die ganz persönliche Meinung eines anonym angemeldeten Forenmitglieds und sollte nicht dem Betreiber dieses Forums angelastet werden.] buggybuggybuggy-Implementierung von Bills Bande.

Die Ausgaben von "date/t" und %date% und die Ausgaben von "time/t" und %time% sind nicht gleich.
Beispiel für (deutsche) Zeit:
>time /t & echo %time%
 1:18
 1:18:38,97
--->How The ..Kuckuck kommt so etwas durch die Qualitätskontrolle?
Ebenso unglaublich, dass hinter der Ausgabe von "date/t" ein übersehenes Leerzeichen hängt (siehe die Ausgaben in meinem Schnipsel oben).
Praktikantenpfusch.

Anyhow, die Registry-Werte, die wir hier manipulieren, sind immer sofort bei date/t und time/t wirksam... aber bei time/t ist mir keine Holzhammermethode bekannt, mit der ich via Registry die Sekunden mit anzeigen lassen kann.

Eventuell kannst Du es mal versuchen, ob Du über Klickibunti (Einstellungen->Regions- und Spracheinstellungen->Datum und Uhrzeit") eine solche Möglichkeit findest.
Und dann in der Registry nachschauen, was sich geändert hat.

Oder mal abwarten, ob jemand anderes vielleicht mal darüber gestolpert ist und das hier postet.

Zwei Anmerkungen noch zu Deinem Skript:
Die ganzen ausgeREMten Zeilen kannst Du, wenn Du die nicht wegwerfen willst, überspringen,wenn Du in Zeile 99 aus dem ":loop" ein "goto :loop" machst und diese Sprungmarke :loop" nach Zeile 111 setzt.

Und statt "sleep 1" würde ich ein "sleep 30" oder so setzen...
...wir wollen es doch nicht übertreiben.
Hey, ist nur ein Batch... kein Satellitensteuerungsprogramm...

Grüße
Biber
DaSilva
DaSilva 21.06.2008 um 02:06:21 Uhr
Goto Top
Danke, das wärs dann soweit.
Kann es sein, dass %deDate%, %endate% und %date% zu verschiedenen Uhrzeiten mal ein Leerzeichen vor oder hinter dem eigentlichen Wert haben?
Zuerst hatte ich noch "%deDate% um %time:~0,8%" was dann "20.06.08 um 20:15:00" ergab, dann habe ich es zu "%deDate%um %time:~0,8%" geändert um das doppelte Leerzeichen zu umgehen und jetzt gerade war ein doppeltes Leerzeichen hinter um (oder vor %time:~0,8%) was mich gar zu "%deDate%um%time:~0,8%" bewegte. Jetzt weiß ich noch nicht ob ich mich eben verguckt habe oder ob es mit der Zeit zu tun hat aber jedenfalls ist da irgendwas krumm.
Bei der englischen Zeit dagegen reicht derzeit ein "%endate%at %EnTime%" für die richtige Darstellung ohne zu viele Leerzeichen.
Ist dir da etwas bekannt bzw. kannst du das nachvollziehen?
Biber
Biber 21.06.2008 um 13:15:44 Uhr
Goto Top
Moin DaSilva,

wie geschrieben, ich halte die vorhandene M$-Implementierung der Regions/Spracheinstellungen für suboptimal...
Und Dein wahrgenommenes Phänomen passt zu meiner Wahrnehmung.
Das merkwürdige Leerzeichen nach der "date /t"-Ausgabe hatte ich ja auch schon angesprochen. Wenn das nun auch "nicht immer da ist", dann... na ja, sagen wir so: Kann auch sein, dass ich einen Tippfehler drin habe. Ich werde es noch mal prüfen.
Kann aber auch sein, das M$ einen klitzekleinen Flüchtigkeitsfehler übersehen haben könnte.

A propos Murks:
Ich würde auch gern nachbessern - an einer Stelle habe ich gepennt.
Die Werte s1159 und s2359, die bei Dir als "nicht gefunden" angemeckert wurden:
Fehlinterpretation von mir. Die existieren als REG_SZ, aber die sind {leer}.

Ich ändere deshalb die beiden Call:Blöcke unterhalb des eigentlichen Schnipsels wie folgt:
.....
...
~~~~~~~~~ [End of bätschelchen]
:SetNewvalue param1=wert param2=value in Anfü-Zeichen

If %2=="""" (   
   reg add %regkey% /v "%~1" /f >nul  
) else (   
   reg add %regkey% /v "%~1" /d "%~2" /f >nul  
)
goto :eof

:SaveOldValue param1=regValue 
For /f "tokens=2*" %%i in ('reg query %regkey% /v "%~1" ^2^>nul^|findstr  /i "%~1"') do (  
    If "%%j" Equ "" (set old_%1="") else set "old_%1=%%j"  
) 
goto :eof

Lese ich jetzt einen "leeren" Registrywert, dann wird die old_xxx-Variable auch auf "" gesetzt.
Soll ein RegValue auf "leer" gesetzt werden, dann ist die Syntax des Reg.exe-Utilities auch weniger dubios, wenn der /d-Parameter ( /d=fülle mit Daten) ganz weggelassen wird.
Ich ziehe diese Änderung oben im Schnipsel nach.

Einen Nachtrag noch zu dem Time/t-Wert und ob der auch Sekunden anzeigen kann.
Vergiss es. Habe in meinen Akten nachgeschaut.
Der Time/t-Wert wird nur minütlich aktualisiert.
Also ist auf diesem Weg keine Sekunden-Information abgreifbar.

Grüße
Biber
DaSilva
DaSilva 28.06.2008 um 18:40:47 Uhr
Goto Top
Was mir gerade erst aufgefallen ist:
Die englische Zeit ist eine Stunde früher als die (richtige) deutsche
Zeit.
Eben wurde 15:41:41 und 2:41 PM angezeigt.
Wie kann ich das noch korrigieren?
Danke.