Solaris: Timestamp in Unix Timestamp umwandeln

GWFgamer

Ensign
Registriert
Juli 2006
Beiträge
167
Liebe Community,

ich sitzte zurzeit an einem neuen SH- Script, welches auf einem Solaris System ohne GNU Zeit ausgeführt wird. Ich versuchen schon seit Stunden mit Daten zu rechnen, zu diesem Zweck will brauche ich aber den Unix Timestamp.

Es ist in einer Variable ein Zeitstempel mit folgendem Format gespeichert: YYYYMMDDHHMM
Nun möchte ich 2 Minuten auf dieses Datum addieren. Das Datum ist ausdrücklich nicht die aktuelle Uhrzeit!
Hat jemand von euch eine Idee, wie ich den Zeitstempel YYYYMMDDHHMM in die Unix Time umgewandelt bekomme, also die Zeit zwischen 1970 und YYYYMMDDHHMM in Sekunden?

Vielen Dank!
 
Hmmm, also ich würde eine Variable mit dem 1970er Datum versehen (im selben Format wie deine aus dem Skript) und dann beide voneinander abziehen, so ähnlich wie

START="197001010001"
DATUM="YYYYMMDDHHMM"
DIFF=$(( $DATUM - $START ))

echo "Das ergibt $DIFF ..."

Welche Shell verwendet Dein Skript, oder kann es auch Perl sein?
 
Ja Perl is auch okay, dann wären natürlich Einzeiler ganz nett ^^ Ich verwende die SH Shell.

Danke für deine Idee, ich bin mir aber nicht sicher ob das klappt. Wenn ich so eeinfach zwei Daten von einander abziehe, dann kommt dort ja keine UNIX Zeit raus.
Ergänzung ()

Mir fiel auch grad ein, das ich das per Hand auusrechnen könnte, sozusagen gucke, wieviele Jahre, Monate, Tage, Stunden etc dazwischen liegen und diese in Sekunden umrechne. Aber selbst mit den offiziell richtigen Zahlen der http://www.epochconverter.com/ Webseite habe ich bei 40 Jahren Unterschie (von 1970 bis 2010 z.B.) über einen Tag Unterschied ...

Also nicht wirklich elegant und auch viel zu ungenau für meinen Zweck. \

Jemand noch eine Idee, wie ich den Unix Timestamp eines Datums im Format YYYYMMDDHHMM rausbekommen kann?
 
Zuletzt bearbeitet:
Ein bisschen spät...

In Perl:
Code:
#!/usr/bin/perl -w

use Time::Local;

my ($y, $m, $d, $hh, $mm)= ($ARGV[0]=~/(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)/);

my $time= timelocal(0, $mm, $hh, $d, $m-1, $y);
#my $time= timegm(0, $mm, $hh, $d, $m-1, $y);
print $time;
Obiges Script rechnet in lokaler Zeit, für UTC/GMT die Zeile mit "timegm" einkommentieren und die Zeile mit "timelocal" auskommentieren...

Code:
./date2seconds.pl 201212181314
liefert

1355832840


In C:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(int argc, char *argv[])
{
  struct tm tm;
  char buf[40];

  if (argc<2 || strlen(argv[1])!=12)
  {
    fprintf(stderr, "date must have exactly 12 digits!\n");
    exit(1);
  }
  memset(&tm, 0, sizeof(struct tm));
  strptime(argv[1], "%Y%m%d%H%M%S", &tm);
  strftime(buf, sizeof(buf), "%s", &tm);
  printf("%s", buf);
  return 0;
}
Compilieren mit:
Code:
gcc -o date2seconds date2seconds.c
Die C-Variante rechnet auch in Lokalzeit (bzw. wertet die Umgebungsvariable "TZ" aus).

Code:
./date2seconds 201212181314
liefert

1355832840


HTH

BigNum
 
Wenn er sowieso was installieren/compilieren muß, kann er auch gleich GNU-Date installieren und nutzen. Damit läßt sich zu einer Zeit wie YYYYMMDDHHMM der Unix-Timestamp so ermitteln:

date -d "YYYYMMDD HHMMZ" +%s

Das Z am Ende steht für Zulu-Zeit. Ohne Z wird die Zeitangabe als in der aktuellen Zeitzone angegeben interpretiert und liefert somit hierzulande im Sommer ein um 3600 s anderes Ergebnis als im Winter. Die Formate, die die Option -d frißt, kann man via 'info date "Date input formats"' nachlesen.

Auf den ermittelten Timestamp dann 120 (=2 Minuten) addieren und den neuen Timestamp wieder an date verfüttern und in beliebigem Format ausgeben lassen.

date -d @123456789 +'%Y%m%d %H%M'
 
Zuletzt bearbeitet:
Zurück
Oben