date -d @ 526276800 "+% m /% d /% y"
Muitas vezes eu me vejo precisando converter de um tipo de tempo para outro, e não encontrei uma maneira que eu esteja sempre feliz com isso. Toda vez que eu faço uma rápida pesquisa no google, chego a respostas diferentes (às vezes dolorosamente complexas).
Estou feliz com
date -d "Sep 5 1986" "+%s"
para converter uma data padrão em hora de época, mas não consigo fazer o trabalho inverso (e as páginas man que naveguei não estão ajudando muito).
date -d "526276800" "+%m/%d/%y"
produz um erro na minha instalação do RHEL 5.
A comunidade pode me oferecer algumas estratégias para conversão fácil? Vou tomar todas as formas: awk, perl, date. Quais são os prós e contras de cada método?
Na minha caixa do Mac OS X, eu uso:
date -r 526276800 +%m/%d/%y
Com a data do GNU:
date -d '1970-01-01 946684800 segundos'
Ou em Ruby:
% ruby -e 'puts Time.now.to_f'
1243620267.8988
% ruby -e 'puts Time.now.to_i'
1243620267
% ruby -e 'puts Time.at 1243620270'
Fri May 29 11:04:30 -0700 2009
% ruby -e 'puts Time.at(1243620270).strftime "at %I:%M%p"'
at 11:04AM
Aqui estão os formatos strftime
, retirados da documentação da classe ruby Time
:
%a - The abbreviated weekday name (''Sun'')
%A - The full weekday name (''Sunday'')
%b - The abbreviated month name (''Jan'')
%B - The full month name (''January'')
%c - The preferred local date and time representation
%d - Day of the month (01..31)
%H - Hour of the day, 24-hour clock (00..23)
%I - Hour of the day, 12-hour clock (01..12)
%j - Day of the year (001..366)
%m - Month of the year (01..12)
%M - Minute of the hour (00..59)
%p - Meridian indicator (''AM'' or ''PM'')
%S - Second of the minute (00..60)
%U - Week number of the current year,
starting with the first Sunday as the first
day of the first week (00..53)
%W - Week number of the current year,
starting with the first Monday as the first
day of the first week (00..53)
%w - Day of the week (Sunday is 0, 0..6)
%x - Preferred representation for the date alone, no time
%X - Preferred representation for the time alone, no date
%y - Year without a century (00..99)
%Y - Year with century
%Z - Time zone name
%% - Literal ''%'' character
$ perl -le 'print scalar localtime 1243620900'
Fri May 29 11:15:00 2009
Pode ser um pouco pesado, mas no Perl há um ótimo módulo chamado DateTime que é convertido entre uma infinidade de datas & formatos de hora, incluindo época. É muito simples de usar:
Pessoalmente, uso alternativamente o Python e o bash para isso. Mas já que você está aborrecido com isso ;-) eu gostaria de fazer um pequeno script que pega uma data como um parâmetro e escreve-o de modo a ter opções --2epoch e --2normal.
Dessa forma, você pode converter de época para normal com
./script.sh --2normal 1243609635
e o contrário com
./script --2epoch "20090529 17:07"
A data de entrada é sempre formatada da mesma maneira? Isso tornaria o script muito mais fácil de escrever.
One-liner Perl:
$ perl -MDate :: Manip -le 'imprime UnixDate (ParseDateString ("epoch" .shift ()), "% c")' 946684800
dump timochamps de época para formas legíveis de stdin (primeiro exemplo) ou como args (segundo exemplo), e não esqueça o poder do strftime!
perl -pe '$_=~s/(\d{10})/scalar localtime($1)/eg'
perl -e '$s=join(" ",@ARGV);$s=~s/(\d{10})/scalar localtime($1)/eg;print"$s\n"'
perl -pe 'use POSIX qw(strftime);s/(\d{10,10})/strftime("%Y%m%d-%H:%M:%S",$1)/eg'
Se você tiver o módulo Date :: Manip instalado para perl (que normalmente não está lá por padrão), você pode usar:
perl -MDate::Manip -e '$stamp=UnixDate(ParseDate(join(" ",@ARGV)),"%s");printf"%d %s\n",$stamp,scalar localtime($stamp)' sep 9 2006
Às vezes é difícil decidir se você deseja SUBSTITUIR os carimbos de hora em seu "filtro", ou se você deseja inserir a linha com o timestamp encontrado. Eu viro de um lado para o outro.
Tags time