Datum und Zeit mit Cygwin

Beispiele zur Ergänzung der Windows-Konsole

Cygwin ist die kostenlose Portierung der Linux Shell-Konsole (bash) und einiger leistungsfähiger Linux-Dienstprogramme auf Windows.
Die Installation ist sehr empfehlenswert !
Auf dieser Seite finden sie einige Beispiele, wie die veraltete Windows-Konsole mit Cygwin-Funktionen ergänzt werden kann.
Cygwin Linux Shell-Konsole auf Windows: Installation, Konfiguration
Voraussetzung Saubere Cygwin-Installation und Konfiguration
Zeitzone Wichtige Ergänzung der Cygwin-Installation
Text Alias-Befehle zur Ausgabe von ISO-8601 und anderen formatierten Texten
Arithmetik Rechnungen mit Datum und Zeit: UNIX-Timestamp, Y1900, Sekunden seit Mitternacht ..
Registry Zugriff auf Windows Registry-Daten
verwandte Themen Datum & Zeit (Standards),   Entwicklung mit C/C++, Javascript, Perl, PHP, SQL, VBA,   Betriebssysteme Linux & Windows

Voraussetzungen

Für alle auf dieser Seite beschriebenen Beispiele muss Cygwin auf Windows vollständig installiert und sauber konfiguriert sein.
Details zur Installation von Cygwin auf Windows
Falls sie → Linux verwenden, dann ergibt Cygwin keinen Sinn, da alle damit portierten Funktionen in ihrem System bereits enthalten sind. Sie können alle gezeigten Beispiele sofort und ohne Installation an ihrer Shell-Konsole ausprobieren.

Cygwin-Pfad

Cygwin sollte in diesem Pfad installiert sein:
C:\Programme\Cygwin
Wenn sie einen anderen Pfad verwenden, dann müssen sie alle Pfad-Angaben dieser Seite sinngemäß ändern.

Eigene Programme

Sie sollten ein Verzeichnis für eigene Programme angelegt haben, z.B.
C:\Programme\_myprox

Umgebungs-Variable

In Windows sollte eine Umgebungs-Variable mit dem Namen cyg und dem Pfad zu den Dienstprogrammen als Wert installiert sein:
C:\Programme\Cygwin\bin\
Test (Pfad, Test-Programm ascii.exe) mit
C:\> path
C:\> echo %cyg%
C:\> ascii
Die Umgebungs-Variable PATH sollte folgende Pfade enthalten:
Den Pfad %cyg% zu den Cygwin Programmen
Den Pfad zu ihren eigenen Programmen

Details zur Konfiguration von Cygwin und zu Windows Umgebungs-Variablen.

Dienstprogramme

Wenn sie mit Cygwin nur die Grundfunktionen installiert haben, dann sollten sie die → Installation aller verfügbaren Linux Shell Dienstprogramme nachholen.

Die Linux Shell Dienstprogramme sollten in diesem Pfad enthalten sein:
C:\Programme\Cygwin\bin
Für die Beispiele dieser Seite werden mindestens folgende Programme benötigt:
bash.exe, date.exe, expr.exe, info.exe, man.exe, regtool.exe, sh.exe

Zeitzone

Cygwin portiert einige wichtige Linux Konsolen-(Shell)-Dienstprogramme auf Windows. Die Linux-Programme verwenden dazu ihr gewohntes Umfeld.
Zur Umgebung des Linux-Dienstprogramms date gehört auch die Information über Zeitzonen. Die dazu notwendigen Dateien sind derzeit in der Cygwin Installation nicht enthalten. Daher liefern alle Cygwin Datum & Zeit Funktionen nur die Weltzeit UTC (GMT).
Man kann Cygwin mit Original-Linux Daten ergänzen: Das Archiv zoneinfo.zip enthält die Daten für Europa. Nach Installation wird sowohl die lokale Zeit ihrer Zeitzone als auch die Weltzeit UTC korrekt angezeigt.
Wenn sie Linux verwenden, sind alle notwendigen Daten (weltweit) bereits hier installiert:
\usr\share\zoneinfo
Test:
Öffnen sie eine → Cygwin-Konsole und geben sie ein
$ date
Wenn die Ausgabe in Lokalzeit erfolgt (z.B. CET oder CEST), dann ist die Zeitzone bereits installiert.
Wenn die Ausgabe in Weltzeit erfolgt (GMT), dann sollten sie die Zeitzonen-Daten installieren.

Download von windows_zoneinfo.zip
Installation:
Expandieren sie das Archiv zoneinfo.zip mit Kompander-Software (WinAce, WinRaR, WinZip, InfoZip, Cygwin-bzip2/bzcat, ..).
Verschieben sie das Archiv an diesen Pfad:
C:\Programme\Cygwin\usr\share\zoneinfo\Europe
Ändern sie den Pfad sinngemäß, wenn Cygwin anders installiert ist.

Umgebungs-Variable TZ

Cygwin und andere von Linux nach Windows portierte Programme (z.B. PHP) erwarten eine Umgebungs-Variable TZ mit Angabe der Zeitzone.
Auf Linux wird die Zeitzone als Text (String) im Format Region/Stadt angegeben.
Im hier enthaltenen Archiv ist nur die Region Europa enthalten. Alle anderen Regionen können sie mit Original Linux Daten ergänzen.
Der Name der Stadt muss genau dem Namen einer Datei im Verzeichnis zoneinfo entsprechen.
Typische Werte der Variablen TZ in Mitteleuropa lauten z.B. Europe/Berlin oder Europe/Vienna oder Europe/Zurich

So installieren sie die Umgebungs-Variable TZ auf Windows:
Öffnen sie Systemsteuerung | System | Erweitert | Umgebungsvariablen
Klicken sie im unteren Fenster (Systemvariablen) den Button Neu und erstellen sie eine Variable mit dem Namen TZ und dem ausgewählten Wert, z.B. Europe/Vienna
Melden sie sich vom System ab (Logout) und wieder an (Login) oder führen sie einen Neustart aus.
Details zu Windows Umgebungs-Variablen

Test:
Öffnen sie eine Cygwin-Konsole und geben sie ein:
$ set
In der Liste der Umgebungs-Variablen sollte TZ korrekt angezeigt werden.
$ date
Datum und Zeit sollte nun in Lokalzeit (CET oder CEST) angezeigt werden.
Befehle der Shell-Funktion date betreffen ohne besondere Option die Lokalzeit, mit der Option -u oder --utc jedoch die → Weltzeit UTC.
Ausnahme: Wenn die lokale Zeitzone unbekannt oder fehlerhaft eingestellt ist, dann wird immer die Weltzeit UTC (GMT) angegeben.
Beispiele:
$ date
$ date -u
$ date "+%T %Z"
$ date -u "+%T %Z"
Ausnahme: Der → UNIX-Timestamp ist weltweit eindeutig und wird definitionsgemäß immer in Weltzeit UTC angegeben:
$ date "+%s"

ISO 8601 und andere Text-(String)-Formate

Die Linux Shell bietet die Möglichkeit zur Erstellung von Alias - Das sind Namen für bestimmte Befehlstexte. Auf der → Cygwin-Seite finden sie ein einfaches→ Alias-Beispiel.
Die hier angeführten Beispiele demonstrieren die Herstellung und Anwendung von Alias unter schwierigen Bedingungen.
Beispiel:
Die Windows-Konsole bietet diese Möglichkeiten (Option /T für 'Ausgabe ohne Fragen'):
C:\> date /T
C:\> time /T
Ziel: Datum und Zeit sollen gemeinsam inkl. Sekunden im Standard-Format → ISO-8601 ausgegeben werden: YYYY-MO-DD hh:mi:ss

(1) Analyse der verfügbaren Befehle

Die Cygwin-Konsole kann zwar alle Windows-Befehle verwenden, bevorzugt jedoch eigene Befehle, wenn diese als core-Befehl (in der Shell bash.exe ) oder als Dienstprogramm (in /bin ) enthalten sind.
Das ist hier der Fall: time ist ein core-Befehl und date ein Dienstprogramm.
Sehen sie sich die → Dokumentation zu diesen Anweisungen an:
$ man date
$ man time

(2) Anwendung an der Cygwin-Konsole

Das Programm date ist für dieses Beispiel geeignet:
Die Aufgabe wird z.B. so gelöst:
$ date "+%F %T"
Wenn die lokale Zeitzone noch nicht Linux-konform eingestellt wurde, dann erfolgt die Ausgabe in Weltzeit UTC bzw. GMT - Die Zeitzone können sie mit %Z zusätzlich ausgeben:
C:\> %cyg%date "+%F %T %Z"

(3) Anwendung an der Windows-Konsole

Die Windows-Konsole kann zwar alle Shell-Befehle verwenden, bevorzugt jedoch gleichnamige eigene Befehle, wenn diese als core-Befehle (in cmd.exe ) oder als Dienstprogramme (irgendwo in einem PATH-Pfad) enthalten sind.
Man könnte die Reihenfolge der Pfade in der → Windows Umgebungs-Variable PATH ändern, und den Pfad zu Cygwin %cyg% allen anderen Pfaden voranstellen. Davon wird jedoch dringend abgeraten. Eine wesentlich bessere Methode ist das Voranstellen der Variablen %cyg% im Befehlstext (2 äquivalente Varianten):
C:\> %cyg%date "+%F %T"
C:\> %cyg%date +%F%9T
C:\> %cyg%date +%Y-%m-%d%9T

Diese Anweisung gibt Datum und Uhrzeit im gewünschten ISO Standard-Format inkl. Sekunden aus, z.B.
2003-04-05 12:34:56
Beachten sie den Unterschied der Syntax bei Verwendung in einem Windows Konsolen-Script *.cmd

(4) Anlegen eines Shell-Alias

Der Befehl funktioniert nun wunschgemäß, ist aber schwer zu merken und kompliziert einzutippen. Daher wird an der Cygwin-Konsole ein Shell-Alias angelegt:
$ alias date_iso="date '+%F %T'"
$ date_iso
$ alias
Der selbst erzeugte Befehl date_iso gibt bei jeder Anwendung Datum und Zeit im gewünschten Format aus.
Kontrollieren sie vor dem Anlegen eines Alias, ob in /bin ein Dienstprogramm mit dem gleichen Namen existiert (z.B. test ). Verwenden sie in diesem Fall einen anderen Alias-Namen.
Befehl alias (ohne Argumente) gibt eine Liste aller angelegten Shell-Alias aus.

(5) Permanente Übernahme des Alias

Ein auf der Shell-Konsole eingegebener Alias-Befehl ist nur bis zum Ende der jeweiligen Session (Schließen des Cygwin-Fensters) gültig.
Nützliche Befehle werden daher in die Konfigurations-Datei übertragen:
Öffnen sie ihre private Konfigurations-Datei
/home/username/.bashrc
und fügen sie diese Zeilen am Ende der Datei an:
# Ausgabe nach ISO-Standard YYYY-MO-DD hh:mi:ss
alias date_iso="date '+%F %T'"

Starten sie danach ein neues Cygwin-Fenster:
$ date_iso
Der selbst erzeugte Befehl sollte wunschgemäß funktionieren .

(6) Anlegen eines Windows-Alias

Selbst erzeugte Befehle sollten auch an der Windows-Konsole verfügbar sein - und damit nicht nur für die manuelle Anwendung sondern auch für alle anderen Programme.
Windows-Programme haben keinen Zugriff auf Shell-Alias, da diese nur im Cygwin-Fenster definiert sind.

Für die Windows-Verwendung werden eigene *.cmd Befehls-Dateien angelegt.
Voraussetzung: Sie haben ein → Verzeichnis für eigene Programme angelegt und den Pfad dorthin in die → Windows Umgebungs-Variable PATH eingetragen.
Erzeugen sie eine Text-Datei in ihrem privaten Programm-Verzeichnis
C:\Programme\_myprox\date_iso.cmd
und tragen sie diesen Text ein
@→ echo off
%cyg%date "+%%F %%T"

Alle im Shell-Befehlstext verwendeten % Zeichen müssen für den Windows commandline interpreter mit einem zusätzlichen % maskiert werden.
Falls sie keine Umgebungs-Variable %cyg% definiert haben, müssen sie den Pfad komplett angeben:
C:\programme\cygwin\bin\date "+%%F %%T"

Anschließend ist der selbst erzeugte Befehl in jeder Windows-Konsole verfügbar
C:\> date_iso
Falls der Befehl nicht erkannt wird, versuchen sie den vollen Pfad:
C:\> c:\programme\_myprox\date_iso.cmd
Wenn nur der volle Pfad funktioniert, sollten sie den Pfad zu ihren privaten Programmen in die → Windows Umgebungs-Variable PATH eintragen.
Nach diesem Muster können sie beliebige eigene Befehle anlegen.
Die Tabelle zeigt die Formulierung zur Ausgabe häufig verwendeter Datum & Zeit - Texte (Strings)

AusgabeFormatShellcmdMuster
ISO-8601 Zeithh:mi:ss $ date "+%T" C:\> %cyg%date "+%T" 12:34:56
ISO Datum & Zeityyyy-mo-dd hh:mi:ss $ date "+%F %T" C:\> %cyg%date "+%F %T" 2003-04-15 12:34:56
ISO Woche des Jahresyyyy-Www $ date "+%Y-W%v" C:\> %cyg%date "+%Y-W%v" 2003-W45
ISO Tag des Jahresyyyy-ddd $ date "+%Y-%j" C:\> %cyg%date "+%Y-%j" 2003-123
ISO-Tag der Woched $ date "+%u" C:\> %cyg%date "+%u" 7
Weltzeithh:mi:ss UTC $ date -u "+%T %Z" C:\> %cyg%date -u "+%T %Z" 11:34:56 UTC
DIN 5008d.mo.yyyy hh:mi:ss $ date "%d%.m%.Y %T" C:\> %cyg%date "%d%.m%.Y %T" 15.4.2003 12:34:56
DIN 5008d.mo.yy $ date "+%d.%m.%y" C:\> %cyg%date "+%d.%m.%y" 15.4.03
RFC-2822  $ date --rfc-2822 C:\> %cyg%date --rfc-2822 Sun, 4 Apr 2003 12:34:56 +0100

Arithmetik

Die → Linux-Shell kann auch einfache Rechnungen und logische Operationen ausführen.

Variable werden mit beliebigen Namen (hier x,y ) bezeichnet. Bei Verwendung in einem Ausdruck wird das $ Zeichen vorangestellt, z.B.
$ x=123
$ y=$x
$ echo y (als Text) = $y
Die beiden Variablen $x und $y enthalten allerdings "123" als Text !
Für Rechnungen wird eine spezielle Syntax (rechts) verwendet.
Befehle, deren Ergebnis wie der Wert einer Variablen eingesetzt werden soll, werden mit $( ) umschlossen, z.B.
$ x=$(date '+%s')
$ echo Unix Timestamp = $x

Arithmetische Berechnungen werden in $(( )) eingeschlossen., z.B.
$ y=$(($x+123))
$ echo $x + 123 = $y

UNIX-Timestamp

Ein → Unix Timestamp gibt die Anzahl Sekunden seit 1970-01-01 00:00:00 an. Ein Timestamp wird immer in Weltzeit → UTC angegeben und ist daher weltweit eindeutig, unabhängig von Zeitzone und Sommerzeit.

Die Shell-Funktion date kann den aktuellen Timestamp ausgeben:
$ date "+%s"
Nach Umwandlung in eine ganze Zahl kann man damit rechnen, z.B.
$ uts=$(($(date '+%s')))
$ x=$(($uts+1))

Zur Ausgabe des Timestamp an der Konsole kann man z.B. ein Alias anlegen:
$ alias date_uts="date '+%s'"
Zur permanenten Verwendung wird das Alias in der Konfigurationsdatei eingetragen:
/home/username/.bashrc
(Ersetzen sie username entsprechend)
Zur Verwendung mit der Windows-Konsole wird eine Text-Datei date_uts.cmd angelegt.

Details im Kapitel Text-Formate dieser Seite.

Tricks gegen führende Nullen

Die Shell-Funktion date kann mit den Format-Strings %H %M %S Stunden, Minuten und Sekunden der aktuellen Zeit ausgeben. Die Ausgabe erfolgt als 2stelliger Text, der (meistens) in eine Zahl umgewandelt werden kann:
$ echo $(($(date '+%S')))
Wiederholen sie diese Anweisung mehrmals. Zur Wiederholung klicken sie die Pfeil-Taste (nach oben) ihrer Tastatur, danach return
Wenn Sekunden<=9 ist, dann wird der Text wegen der führende Null als Oktalzahl (Basis 8) interpretiert.

Es gibt mehrere Möglichkeiten, dieses Problem zu beheben. Hier wird der Text mit einem führenden Zeichen 1 ergänzt, danach in eine Zahl umgewandelt, zuletzt wird 100 subtrahiert:
$ echo $((1$(date '+%S')-100))

Sekunden seit Mitternacht

Diese Berechnung kann für mehrere Aufgaben verwendet werden. Deshalb wird eine Funktion verwendet und das Ergebnis in einer Variablen datim_sfm gespeichert. Diese Variable ist bis zum Ende der Session (Schließen des Shell-Fensters) gültig:
calc_datim_sfm() {
datim_sfm=$(((1$(date '+%H')-100)*3600))
datim_sfm=$(($datim_sfm+(1$(date '+%M')-100)*60))
datim_sfm=$(($datim_sfm+(1$(date '+%S')-100)))
}
Die Funktion wird ebenso wie ein Alias in die Konfigurationsdatei eingetragen und ist in jedem danach geöffneten Shell-Fenster verfügbar.

Es ist sinnvoll, Berechnung und Ausgabe zu trennen: In diesem Fall kann die Berechnung (ohne störende Ausgabe) auch für andere Zwecke verwendet werden.
So wird das Ergebnis angezeigt:
$ calc_datim_sfm
$ echo datim_sfm = $datim_sfm

Alias-Befehl für Berechnung + Ausgabe der Sekunden seit Mitternacht:
$ alias date_sfm="calc_datim_sfm; echo \$datim_sfm"
Anwendung des Alias-Befehls:
$ datim_sfm

Wenn eine Befehlszeile mehrere Befehle enthält, dann wird das Trennzeichen ; verwendet.

Wenn in einem Alias eine Variable verwendet wird, dann wird sie einmalig beim Anlegen des Alias expandiert, d.h. durch den aktuellen Wert der Variablen verwendet.
In diesem Fall soll die Variable jedoch jedesmal bei Aufruf des Alias-Befehls neu eingesetzt werden, daher wird der Variablen-Name mit einem \ Zeichen maskiert - er wird dann erst bei der Anwendung expandiert.

Sekunden bis Mitternacht

Die Funktion calc_datim_sfm (Absatz oberhalb) kann zur Berechnung der Zeit bis Mitternacht verwendet werden:
$ calc_datim_sfm
$ echo datim_stm = $((86400-\$datim_sfm))
Dazu werden die bereits vergangenen Sekunden von der Gesamtzahl Sekunden pro Tag (24*60*60=86400) abgezogen.

Alias-Befehl zur Ausgabe der Sekunden bis Mitternacht:
$ alias date_stm="calc_datim_sfm; echo \$((86400-\$datim_sfm))"

Tages-Bruchteil

Für manche Aufgaben muss die Tageszeit als Tages-Bruchteil mit einem Wert 0..1 angegeben werden. Das kann auch mit ganzen Zahlen berechnet werden, wenn man den Bruchteil mit einer größeren Zahl (hier 100000) multipliziert.
Dazu wird eine Funktion angelegt und in die Konfigurations-Datei eingetragen:
calc_datim_dayfrac() {
calc_datim_sfm
datim_dayfrac=.$(expr substr $((100000+$datim_sfm*1000/864)) 2 5)
}

Zum Test der Funktion können sie eingeben:
$ calc_datim_dayfrac
$ echo dayfrac=0.$datim_dayfrac

Y1900-Datum

Die meisten M$-Produkte verwenden zur internen Darstellung von Datum und Zeit das → Y1900-System. Das Datum (ganze Zahl) wird in Tagen seit 1899-12-30 00:00:00 angegeben, die Zeit als Nachkomma-Anteil.
Der Datum-Anteil wird mit Hilfe des Unix-Timestamp berechnet, der Zeit-Anteil mit Funktion calc_datim_dayfrac (Absatz oben):
function calc_datim_y1900() {
calc_datim_dayfrac
datim_y1900=$(($(date '+%s')/86400+25569))$datim_dayfrac
}
Die Funktion wird in die Konfigurations-Datei eingetragen.
Alias-Befehl zur Ausgabe von Datum und Zeit im Y1900-System:
$ alias date_y1900="calc_datim_y1900; echo \$datim_y1900"
Anwendung des Alias:
$ date_y1900

Vergleich:
Öffnen sie OpenOffice oder Excel und tragen sie in eine Zelle die Funktion =JETZT() ein. Formatieren sie die Zelle als Gleitkomme-Zahl mit 5 Dezimalstellen. Mit Taste F9 wird die aktuelle Zeit eingetragen.

Zugriff auf die Windows-Registry

In der Registry-Datenbank sind alle wichtigen Windows Konfigurations-Daten eingetragen.
Die Funktion regtool bietet Zugang zu allen Registry-Daten.
Hinweis: Diese Funktion gibt es natürlich nur auf Cygwin, nicht auf der Original Linux-Shell - Linux wird nicht mit einer Binär-Datei konfiguriert sondern mit einfachen Text-Dateien.
Konsultieren sie die Hilfe mit
$ man regtool
$ info regtool

Liste

Befehl regtool mit Option list gibt eine Liste aller Subkeys oder Variablen eines Schlüssels key aus.
Zur besseren Übersicht wird der Schlüssel-String schrittweise aufgebaut:
key="/HKLM/System"
key=$key"/CurrentControlSet"
key=$key"/Control"
key=$key"/TimeZoneInformation"
echo "key=$key"
regtool list $key
Ein kleines Programm nach diesem Beispiel lässt sich in eine Funktion einbauen und in der Konfigurations-Datei permanent speichern. Bei kompakter Formulierung kann man (besser) ein Alias in einer einzigen Zeile definieren:
alias reglist="regtool list '/HKLM ..'"

Variable

Befehl regtool mit Option get gibt den Wert einer einzelnen Variablen key2 aus:
key1="/HKLM/System"
key1=$key1"/CurrentControlSet"
key1=$key1"/Control"
key1=$key1"/TimeZoneInformation"
echo "key=$key1"
varname="StandardName"
key2=$key1"/$varname"
varval=$(regtool get $key2)
echo "$varname=$varval"
Auch dieses Beispiel lässt sich in eine Funktion einbauen oder als Alias-Einzeiler formulieren:
alias regval="regtool get '/HKLM ..'"

Schleife

Beide Befehle lassen sich kombinieren.
Im Beispiel rechts wird zuerst ein Schlüssel-String in der Variablen key1 zusammengesetzt. Beachten sie, dass in der Shell / Trennzeichen verwendet werden und jeder Schlüssel-Pfad mit dem obersten Knoten / (noch vor "HKLM") beginnt.
Das Ergebnis der regtool-Liste wird in der Variablen res1 gespeichert.
In einer for-Schleife wird der Variablen varname pro Durchlauf je ein Element der Ergebnis-Liste zugeweisen. Daraus wird der Einzel-Key key2 zusammengesetzt.
Mit regtool get wird der Wert je einer Variablen ermittelt und an res2 übergeben.
Der echo-Befehl gibt Name und Wert jeder gefundenen Variablen aus.
Das Beispiel lässt sich natürlich auf Kosten der Übersicht wesentlich knapper formulieren.
Nach diesem Muster lassen sich die Werte beliebiger Registry-Daten ermitteln und weiter verarbeiten.

Dieses Beispiel gibt für einen Schlüssel key1 alle darin enthaltenen Variablen und deren Werte aus:
registry_demo() {
key1="/HKLM/System"
key1=$key1"/CurrentControlSet"
key1=$key1"/Control"
key1=$key1"/TimeZoneInformation"
echo "key=$key1"
res1=$(regtool list $key1)
for varname in $res1; do
key2=$key1/$varname
res2=$(regtool get $key2)
echo " $varname=$res2"
done
}

Binärzahlen REG_DWORD

Alle Schlüssel des vorigen Beispiels, deren Namen auf "Bias" enden, enthalten Binärzahlen.
Positive Zahlen werden direkt in Variable übernommen, nach Einschluss in $(( )) kann damit gerechnet werden.
Negative Zahlen sind im sog. 2er-Komplement codiert: durch Subtraktion ihres Roh-Wertes von hex FFFFFFFF erhält man ihren positiven (absoluten) Dezimalwert.
Hier wird mit der Variablen ActiveTimeBias die Decodierung demonstriert. Man erhält den Timezone Offset (Abstand der lokalen Zeitzone von der Weltzeit UTC) in Minuten.
Für Mitteleuropa ergibt sich im Winter der Wert tzo_min=60, bei Sommerzeit der Wert 120. Division durch 60 liefert den Offset in Stunden.
Decodierung einer negativen Binärzahl:
key1="/HKLM/System"
key1=$key1"/CurrentControlSet"
key1=$key1"/Control"
key1=$key1"/TimeZoneInformation"
echo "key=$key1"
varname="ActiveTimeBias"
key2=$key1"/$varname"
tzo_min=$(regtool get $key2)
tzo_min=$((4294967296-$tzo_min))
echo "$varname=$tzo_min"

Daten → Umgebungs-Variable

Wenn man Daten wie den Timezone Offset (Absatz oberhalb) nicht jedesmal umständlich in der Registry suchen will, dann kann man daraus → Umgebungs-Variable machen. Solche Variable sind für alle Programme und Programmiersprachen wesentlich leichter zugänglich.
Der Zugriff auf Umgebungs-Variable wird System-unabhängig programmiert - Das ermöglicht die Entwicklung portabler Programme.

Dieses Beispiel wird nicht als Funktion sondern so wie hier gezeigt (besser kompakt formuliert) in die Konfigurations-Datei eingegeben.
Mit Befehl declare -x wird die Umgebungs-Variable TZ_OH für die aktuelle Shell-Session registriert.
Mit Befehl regtool set wird die Umgebungs-Variable für Windows registriert, ist allerdings erst bei der nächsten Anmeldung wirksam !

Details zu Registry & Cygwin und zu Windows Umgebungs-Variablen
Speichern von Daten als Umgebungs-Variable:
key="/HKLM/System"
key=$key"/CurrentControlSet"
key=$key"/Control"
key=$key"/TimeZoneInformation"
echo "key=$key"
varname="ActiveTimeBias"
tzo=$(regtool get $key)
tzo=$(((4294967296-$tzo)/60))
declare -x TZ_OH=$tzo
unset tzo
key="/HKLM/System"
key=$key"/ControlSet001"
key=$key"/Control"
key=$key"/Session Manager/"
key=$key"/Environment"
regtool -s set $key"/TZ_OH" $TZ_OH