2017-01-28 2 views
0

Ich habe eine String-Variable in Unix-Skript mit Daten wie '2017010110' (Format ist wie - %Y%m%d%H). Bitte beachten Sie, dass es nicht Systemzeitstempel ist.Wie setze ich einen String auf Timestamp in Unix?

Jetzt muss ich -1 Stunde von 2017010110 subtrahieren. Bedeutet, dass die Ausgabe 2017010109 sein soll. Ich habe versucht, 1 von der Variablen zu subtrahieren.

Aber wenn der Eingang ist 2017010100, ist es offensichtlich, dass ich bekomme falsche Ausgabe 2017010099 (Erwartete Ausgabe ist 2016123123).

Scheint wie ich meine String-Variable auf Zeitstempel in Unix setzen muss, um diese Subtraktion von 1 Stunde passieren zu lassen.

Ich bezog mich Convert date time string to UNIX timestamp in bash command, konnte aber kein Glück finden.

Könnte mir bitte jemand dabei helfen?

+0

Haben Sie ein 'GNU-Datum' oder ein' FreeBSD-Datum'? – Inian

+0

Hallo. GNU-Datum ist verfügbar. Aber ich weiß nicht, wie ich meine String-Variable auf das Datumsformat für die Subtraktion von 1 Stunde einstellen kann. – user2531569

Antwort

1

einen Blick auf den Code unten nehmen:

#!/bin/bash 
ts="2017010100" 
d="[0-9]" 
if 
    [[ "$ts" =~ ($d$d$d$d)($d$d)($d$d)($d$d) ]] 
then 
    year="${BASH_REMATCH[1]}" 
    month="${BASH_REMATCH[2]}" 
    day="${BASH_REMATCH[3]}" 
    hour="${BASH_REMATCH[4]}" 
    timezone=EST 
    adjusted_ts="$(date -d "$year-$month-$day $hour:00:00 $timezone - 1 hour" "+%Y%m%d%H")" 
    echo "$adjusted_ts" 
else 
    echo "Invalid timestamp" 
fi 

Dieser Code Ihre Zeitstempel in einzelne Felder aufteilt, Feeds GNU date mit einem Zeitformat es 1 Stunde verstehen und entfernt, und setzt eine Variable mit dem Ausgang dieser date Befehl. Der Code ist Bash-spezifisch (mit Bash Regex Matching), aber es gibt Ihnen eine allgemeine Idee.

Bitte beachten Sie, dass ich gezwungen wurde, eine Zeitzone anzugeben, oder (zumindest auf meinem System) gibt es eine Art Offset (wahrscheinlich in Bezug auf UTC), der das Ergebnis durcheinander bringt. Ich habe keine Möglichkeit gefunden, eine Art "LOCAL" -Zeitzone anzugeben, die es vermeiden würde, die Systemzeitzone in den Stachel einzubetten. Ich wäre sehr dankbar für jeden Vorschlag, dies zu verbessern und den Code zeitzonenunabhängig zu machen.

Verwandte Themen