Convertendo de e para o horário da epoca

4

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?

    
por Jax 29.05.2009 / 17:03

9 respostas

7

date -d @ 526276800 "+% m /% d /% y"

    
por 29.05.2009 / 17:07
4

Na minha caixa do Mac OS X, eu uso:

date -r 526276800 +%m/%d/%y
    
por 29.05.2009 / 17:08
1

Com a data do GNU:

date -d '1970-01-01 946684800 segundos'

    
por 29.05.2009 / 18:51
1

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
    
por 29.05.2009 / 20:10
1
$ perl -le 'print scalar localtime 1243620900'
Fri May 29 11:15:00 2009
    
por 29.05.2009 / 20:15
0

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:

link

    
por 29.05.2009 / 17:07
0

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.

    
por 29.05.2009 / 17:09
0

One-liner Perl:

$ perl -MDate :: Manip -le 'imprime UnixDate (ParseDateString ("epoch" .shift ()), "% c")' 946684800

    
por 29.05.2009 / 19:51
0

DA época:

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'

até a época:

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.

    
por 04.06.2009 / 21:52

Tags