Converte um número de segundos decorridos para data da data de início arbitrária

2

Eu quero converter uma quantidade específica de segundos em uma data. No meu caso, é o número de segundos decorridos desde 1º de janeiro de 0001.

Se fosse por segundos decorridos desde a época, seria fácil: $ date -r nr_of_seconds . Seria incrível se houvesse uma maneira de dizer date para começar em uma data específica. Existe tal opção (a opção -v quase faz o que eu preciso, ... eu acho)?

Estou em um Mac.

    
por harm 12.08.2014 / 11:35

3 respostas

0

date -r quase faz o trabalho. Tudo o que você precisa fazer é mudar a origem, o que é uma adição.

date -r $((number_of_seconds - epoch))

em que epoch é o número de segundos entre 1º de janeiro e 1º de janeiro de 1970. O valor de epoch depende do seu calendário.

No calendário gregoriano, há 477 anos bissextos entre 1 e 1970, portanto, 365 * 1969 + 477 = 719162 dias = 62135596800 segundos. Note que este número é maior do que 2 32 , então você precisará de um shell capaz de aritmética de 64 bits para lidar com isso. Seu number_of_seconds será mais do que 2 32 de qualquer forma se representar datas além do segundo século dC. Eu acho que o bash suporta aritmética de 64 bits mesmo em OSX de 32 bits mais antigo, mas não tenho certeza.

date -r $((number_of_seconds - 62135596800))
    
por 13.08.2014 / 02:50
1

Você pode usar isto:

echo $(( 'date +%s' - ' date --date=yesterday +%s ' ))
86400

Você pode substituir "ontem" por qualquer data. Por exemplo:

echo $(( 'date +%s' - ' date --date='Tue Aug 9 11:44:34 CEST 2014' +%s ' ))
259209

Testado no GNU / Linux.

    
por 12.08.2014 / 11:44
0

O problema é que nem todos concordam com as datas anteriores a 1923. Nós (ocidentais) estamos usando o calendário gregoriano. Antes de 1582, as pessoas estavam usando o calendário juliano. Entre 1582 e 1923, algumas pessoas usaram uma ou outra.

Por exemplo, a Inglaterra mudou para o calendário gregoriano em 1752 e é isso que o comando cal usa como ponto de mudança. Veja a saída de cal 9 1752 .

Então, se você encontrar um documento em inglês antigo que se refira ao 3 rd de novembro de 1654, não é necessariamente a mesma data que o mesmo 3 rd de novembro de 1654 se referiu em um documento francês. Tanto os franceses quanto os ingleses da época concordariam com a data 0001-01-01 (como por exemplo o que aconteceu naquele dia), mas essa não é a data em que o GNU date , por exemplo, pensa que foi.

Uma vez eu escrevi algumas funções do shell POSIX para cálculos de datas arbitrárias usando o mesmo switch de calendário como cal e ignorando os segundos bissextos. Você pode encontrá-lo em: link

Por exemplo, para saber qual a data foi 10G segundos (assumindo 86400 segundos por dia, por isso nem todos os segundos com a mesma quantidade de tempo) após 0001-01-01 00:00:00 GMT Julian Calendar:

$ timegm 1 1 1 0 0 0
$ wide_strftime "%c" "$((REPLY + 10000000000))"
echo "$REPLY"
$ echo "$REPLY"
Mon Nov 18 17:46:40 0317
    
por 12.08.2014 / 11:54