Преобразование даты в отметку времени unix в AIX

У меня есть несколько дат, которые преобразуются в этот год, месяц и дату:

20151213 20151214

В AIX кажется, что date -d не распознается параметр -d

date -d 20151213 +%s

Поэтому я не могу преобразовать этот конкретный формат даты, который я получаю динамически, в отметку времени Unix.
Как преобразовать эти даты в AIX в отметку времени?


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)


Perl-модуль Time::Local — это то, что вам нужно:

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

В сценарии оболочки я бы написал

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