Преобразуване на дата в unix timestamp в AIX

Имам няколко дати, които се преобразуват като тази година месец и дата:

20151213 20151214

В AIX изглежда date -d не разпознава опцията -d

date -d 20151213 +%s

Така че не мога да конвертирам този конкретен формат на датата, който получавам динамично, в Unix time stamp.
Как да конвертирам тези дати в AIX в timestamp?


person Kalin Borisov    schedule 14.12.2015    source източник
comment
Търсите ли отговор в Perl или нещо, което може да се използва от обвивката?   -  person Flimzy    schedule 14.12.2015
comment
Какво, че намерих perl, който преобразува клеймото за време в дата, така че предполагам, че има възможен начин за обръщане на процеса, просто не знам как да го направя ... perl -MPOSIX=strftime -e 'print strftime("%Y-%m-%d %T", localtime($ARGV[0])), "\n"' 1381260225   -  person Kalin Borisov    schedule 14.12.2015
comment
Вижте strptime от Time::Piece, ще работи.   -  person TLP    schedule 14.12.2015


Отговори (2)


Time::Local модул на Perl е това, от което се нуждаете:

perl -e '
    use Time::Local;
    for $d ("20151213", "20151214") {
        ($year, $month, $day) = $d =~ /(\d{4})(\d{2})(\d{2})/;
        $epoch = timelocal(0,0,0, $day, $month-1, $year-1900);
        print "$d => $epoch\n"
    }
'
20151213 => 1449982800
20151214 => 1450069200

В shell скрипт бих написал

epoch() {
    echo "$1" | perl -MTime::Local -lne '
        ($year, $month, $day) = /(\d{4})(\d{2})(\d{2})/;
        print timelocal(0, 0, 0, $day, $month-1, $year-1900)
    '
}

timestamp=$(epoch 20151213)
person glenn jackman    schedule 14.12.2015
comment
@CorexCain: Ако смятате, че имате решение, трябва да го публикувате като такова. Особено не публикувайте код в коментари, ако можете да го избегнете, тъй като е нечетлив - person Borodin; 14.12.2015
comment
@glennjackman: Най-добре е да използвате UTC, когато конвертирате времеви марки. Не е полезно вашата програма да дава различни резултати в зависимост от това къде се изпълнява - person Borodin; 14.12.2015
comment
Добре, можем да използваме функцията timegm вместо timelocal и ще получим същите времеви клейма като вашето решение. - person glenn jackman; 14.12.2015

Можете да използвате Perl с модула Time::Piece, за да направите това накратко

use strict;
use warnings 'all';
use feature 'say';

use Time::Piece;

for ( qw/ 20151213 20151214 / ) {
    my $time = Time::Piece->strptime($_, '%Y%m%d')->epoch;
    say $time;
}

изход

1449964800
1450051200
person Borodin    schedule 14.12.2015