Calocybe: Datum -» date-Konvertierung

Beitrag lesen

Auch hi!

15. November 1999, 12.01h
in
           942660822

für Perl gibt es das Modul Time::Local, das sozusagen die Umkehrung von localtime darstellt. Vermutlich mußt Du das Datum immer noch selbst bearbeiten (das "h" am Ende weg z.B.), aber das dürfte mit ein, zwei RegExp recht einfach gehen.

Wird sich nicht ganz vermeiden lassen, da timelocal() und timegm() keine Strings parsen, sondern die Einzelteile einer Datum-/Zeitangabe verlangen. Aber mit der Power der RegExpe ist das ja kein Problem weiter. Und weil mir gerade so war, hab ich das in einem kleinen Script ausprobiert. Aufruf z.B.
    perl parsetime.pl "15. November 1999, 12.01h"
sodass der gesamte String nach $ARGV[0] geht. Wenn das Format des Zeitstrings nicht haargenau mit dem von Marcus angegebenen uebereinstimmt, muss die Variable $TIMESTRING_FORMAT angepasst werden.

Calocybe

use Time::Local;

$TIMESTRING_FORMAT = '(\d+).\s+(\S+)\s+(\d+)\D+(\d+).(\d+)h';

sub ParseLocaltimeString {
    my @MONTHS = ("Jan", "Feb", "Ma[re]", "Apr", "Ma[yi]", "Jun", "Jul", "Aug", "Sep", "O[ck]t", "Nov", "De[cz]");
    my $timestring = shift;
    my $i;
    my ($day, $monthstring, $year, $hour, $min, $month);

if (($day, $monthstring, $year, $hour, $min) = ($timestring =~ /$TIMESTRING_FORMAT/)) {
        $month = -1;
        for ($i=0; $i<12; $i++) { $month = $i if ($monthstring =~ /^$MONTHS[$i]/) }
        if ($month == -1) {
            print STDERR "ParseLocaltimeString: Ungueltiger Monatsname.\n";
            return 0;
        }

$year -= 1900 if ($year >= 1900);

return timelocal(00, $min, $hour, $day, $month, $year);
    } else {
        print STDERR "ParseLocaltimeString: Kein gueltiger Datums-/Zeitausdruck.\n";
        return 0;
    }
}

$x = $ARGV[0];
$time = ParseLocaltimeString($x);
print "Time string to parse is: ", $x, "\n";
print "ParseLocaltimeString returns: ", $time, "\n";
print "To localtime() this is: ", scalar(localtime($time)), "\n";