SOLVED: Datum -> Epoch (Unixzeit)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
bka
Beiträge: 34
Registriert: 15.04.2004 09:15:27
Wohnort: München

SOLVED: Datum -> Epoch (Unixzeit)

Beitrag von bka » 16.01.2007 17:37:48

Hallo,

ich habe folgendes Problem: Ein Script soll ein Verzeichnis prüfen ob da Files drin liegen welche älter als z.b. 2 Stunden sind.

Mein erster Ansatz war das ganze in einer for-Schleife abzufangen und mit cmin bzw. amin abzufangen. Funktioniert auch ganz wunderprächtig unter cygwin, linux .... leider jedoch nicht unter HPUX. Hier kennt das find maximal atime, ctime.

Der zweite Ansatz war ein FIle zu erstellen und die Erstellungszeit der Files im Verzeichnis von der Erstellungszeit des Kontrollfiles abzuziehen. Man kann auch mit date die Zeit in Unixzeit umwandeln.

date -d "13 Jan 2007 15:32:35" +%s

Funktionier unter Linux, cygwin - nicht aber - ihr könnts Euch bestimmt denken - HPUX.

Könnt Ihr mir verraten wie ich nun ein bestimmtes Datum in Unixzeit umrechnen kann?

Grüße
bka
Zuletzt geändert von bka am 17.01.2007 19:20:41, insgesamt 1-mal geändert.

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 16.01.2007 19:42:23

hi,

vielleicht versteht der hpux-stat-Befehl das Sekunden-Format:

Code: Alles auswählen

stat -c %Y $FILENAME
wobei es ein eigenstaendiges stat und einen Shell-internen
stat-Befehl geben koennte.

Als billigen Kompromiss koenntest du das date-Format '%j'
(Tag des Jahres) benutzen und die Sekunden seit 1. Januar
im Script selbst ausrechnen.
Beware of programmers who carry screwdrivers.

bka
Beiträge: 34
Registriert: 15.04.2004 09:15:27
Wohnort: München

Beitrag von bka » 16.01.2007 20:00:20

gefällt mir eigentlich sehr gut - nur leider gibts kein stat unter hpux :evil:
irgendwie gibts gar nichts unter hpux

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 16.01.2007 22:48:08

Nachdem ich grundsätzlich faul bin und mich andernfalls auch öfters mit solchen Problemen herumschlagen müßte, setze ich zumeist Perl als "Posix-Layer" ein:

Code: Alles auswählen

gms@aix1:~$ perl -MTime::Local -e 'print timelocal(35,32,15,13,0,2007),">
1168698755
gms@aix1:~$ perl -MPOSIX -e 'print strftime "%Y-%m-%d %H:%M:%S\n", localtime 1168698755;'
2007-01-13 15:32:35
Perl gibts fast überall, und solange man nicht irgendwelche Spezialfeatures eines Betriebssystems verwendet, funktioniert es auch überall gleich

Gruß
gms

bka
Beiträge: 34
Registriert: 15.04.2004 09:15:27
Wohnort: München

Beitrag von bka » 17.01.2007 08:49:51

8) werd ich gleich versuchen. perl ist sicherlich installiert. geb dann beschei obs funktioniert hat oder nicht

bka
Beiträge: 34
Registriert: 15.04.2004 09:15:27
Wohnort: München

Beitrag von bka » 17.01.2007 09:52:49

kapiers leider noch nicht ganz

welcher tag ist das? (35,32,15,13,0,2007)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 17.01.2007 09:57:35

siehst du hier:

Code: Alles auswählen

gms@aix1:~$ perl -MPOSIX -e 'print strftime "%Y-%m-%d %H:%M:%S\n", localtime 1168698755;' 
2007-01-13 15:32:35
Ist ein bißchen undurchsichtig, weil der 1 Monat des Jahres dern Wert 0 hat

Gruß
gms

[edit]
sehe gerade, daß oben auch beim Kopieren etwas schief gegangen ist
So sollte das ausschauen:

Code: Alles auswählen

gms@gms4:~$ perl -MTime::Local -e 'print timelocal(35,32,15,13,0,2007),"\n"'
1168698755
[/edit]

bka
Beiträge: 34
Registriert: 15.04.2004 09:15:27
Wohnort: München

Beitrag von bka » 17.01.2007 10:12:22

Und Januar ist 0?

bka
Beiträge: 34
Registriert: 15.04.2004 09:15:27
Wohnort: München

Beitrag von bka » 17.01.2007 12:01:00

export STUNDE=14
export MINUTE=34
export TAGE=13
export MONAT=Jan
export JAHR=2007
perl -MTime::Local -e 'print timelocal($SEKUNDE,$MINUTE,$STUNDE,$TAGE,$MONAT,$JAHR),"\n"'
Day '' out of range 1..31 at -e line 1

Kennst Du diesen Fehler auch?

So funktionierts:
perl -MTime::Local -e 'print timelocal($SEKUNDE,$MINUTE,$STUNDE,14,$MONAT,$JAHR),"\n"'
947804400

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 17.01.2007 12:30:59

Dein Problem sind die Singlequotes. Diese verhindern, dass die Shellvariablen in den Perlcode übernommen werden!
So geht es:

Code: Alles auswählen

export SEKUNDE=0
export STUNDE=14
export MINUTE=34
export TAGE=13
export MONAT=Jan
export JAHR=2007
perl -MTime::Local -e "print timelocal($SEKUNDE,$MINUTE,$STUNDE,$TAGE,$MONAT,$JAHR),\"\\n\""
Bei deinem obigen Code sind die Parameter für timelocal in Perl alle undef, da Perl nur $SEKUNDE, $MINUTE usw. sieht und das in dem Fall dann alles undef ist ;)
Deshalb mault er auch, dass der Tag außerhalb des Intervalls von 1 bis 31 ist ;)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 17.01.2007 14:52:39

der Monat sollte aber als Zahl übergeben werden.
Du könntest das aber auch ungefähr so lösen:

Code: Alles auswählen

gms@gms4:~$ cat x.sh
DATE="13 Jan 2007 15:32:35"

perl -x $0 "$DATE"
exit 0
#################################################
#!/perl
#line 7

use Time::Local;
use POSIX qw(strftime);

my %m = ( "Jan", 0, "Feb", 1, "Mar", 2, "Apr", 3 );

foreach my $date ( @ARGV ) {
  my @d = split(/[ :]+/,$date);
  $d[1] = $m{ $d[1] };
  $t = timelocal($d[5],$d[4],$d[3],$d[0],$d[1],$d[2]),"\n";
  print strftime "%d %B %Y %H:%M:%S\n", localtime $t;
  print "$t\n";
}
gms@gms4:~$ ./x.sh
13 Jänner 2007 15:32:35
1168698755
Das Hasharray für die Monate müßtest du dann aber auch noch entsprechend auffüllen

bka
Beiträge: 34
Registriert: 15.04.2004 09:15:27
Wohnort: München

Beitrag von bka » 17.01.2007 19:20:01

yup, die singlequotes waren schuld. jetzt funktionierts. Danke

Antworten