Как преобразовать дату / время в время эпохи (Unix время / секунды с 1970 года) в Perl? - PullRequest
41 голосов
/ 18 сентября 2008

Учитывая дату / время в виде массива (год, месяц, день, час, минута, секунда), как бы вы преобразовали его в время эпохи, то есть количество секунд с 1970-01-01 00:00 : 00 GMT?

Бонусный вопрос: Если бы вы дали дату / время в виде строки, как бы вы сначала проанализировали ее в массиве (y, m, d, h, m, s)?

Ответы [ 12 ]

0 голосов
/ 18 сентября 2008

Фильтр, преобразующий любые даты в различных форматах, связанных с ISO (и кто будет использовать что-нибудь еще после прочтения писем Могущественного Куна?) На стандартном вводе в секундах с начала эпохи на стандартном выводе может служить иллюстрация обеих частей:

martind@whitewater:~$ cat `which isoToEpoch`
#!/usr/bin/perl -w
use strict;
use Time::Piece;
# sudo apt-get install libtime-piece-perl
while (<>) {
  # date --iso=s:
  # 2007-02-15T18:25:42-0800
  # Other matched formats:
  # 2007-02-15 13:50:29 (UTC-0800)
  # 2007-02-15 13:50:29 (UTC-08:00)
  s/(\d{4}-\d{2}-\d{2}([T ])\d{2}:\d{2}:\d{2})(?:\.\d+)? ?(?:\(UTC)?([+\-]\d{2})?:?00\)?/Time::Piece->strptime ($1, "%Y-%m-%d$2%H:%M:%S")->epoch - (defined ($3) ? $3 * 3600 : 0)/eg;
  print;
}
martind@whitewater:~$ 
0 голосов
/ 18 сентября 2008

Если вы просто ищете утилиту командной строки (т.е. не то, что будет вызываться из других функций), попробуйте этот скрипт. Предполагается существование даты GNU (присутствует практически во всех системах Linux):

#! /usr/bin/perl -w

use strict;

$_ = (join ' ', @ARGV);
$_ ||= <STDIN>;

chomp;

if (/^[\d.]+$/) {
    print scalar localtime $_;
    print "\n";
}
else {
    exec "date -d '$_' +%s";
}

Вот как это работает:

$ Time now
1221763842

$ Time yesterday
1221677444

$ Time 1221677444
Wed Sep 17 11:50:44 2008

$ Time '12:30pm jan 4 1987'
536790600

$ Time '9am 8 weeks ago'
1216915200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...