Obtenha o tempo atual em segundos desde a época no Linux, Bash

634

Eu preciso de algo simples como date , mas em segundos desde 1970, em vez da data, horas, minutos e segundos atuais.

dateparece não oferecer essa opção. Existe uma maneira fácil?

n-alexander
fonte
22
Desculpe, devo dizer isso ... '' Data parece não oferecer essa opção. Existe uma maneira fácil '' -? Ler o novo manual do ;-)
TheBonsai
7
Algumas versões da data possuem e outras não. Portanto, nem sempre está presente. Corri 'type -a date' e usei uma versão diferente e que funcionou.
Scott Rowley
1
FWIW, o Ubuntu tem apenas / bin / data, para o qual @ obras resposta do Steef
Jonathan Hartley
1
@TheBonsai que não faz parte da versão padrão POSIX da ferramenta 'date'. Só porque sua versão possui (provavelmente o GNU), você não deve assumir que as implementações de todos o fazem.
Wyatt8740

Respostas:

1160

Isso deve funcionar:

date +%s
Steef
fonte
45
a data manpge deve ser alterada de %s seconds since 1970-01-01 00:00:00 UTCpara %s seconds since the epoch, 1970-01-01 00:00:00 UTCporque eu perdi lá.
Devin
3
Não funciona para mim. data do homem não mostra% s. Eu devo ter uma versão muito antiga do bash (3.2.51 (1) para Solaris)?
precisa saber é o seguinte
7
O @ livefree75 datenão está embutido bash, portanto sua versão bashnão tem nada a ver com a dateimplementação do sistema.
Adrian Frühwirth
11
E se você quiser as frações de segundo, com nove casas decimais, use:date +%s.%N
Jonathan Hartley
19
Para milissegundos de usodate +%s%3N
Juan Campa 12/12
133

Apenas para adicionar.

Obtenha os segundos desde a época (1º de janeiro de 1970) para qualquer data (por exemplo, 21 de outubro de 1973).

date -d "Oct 21 1973" +%s


Converta o número de segundos de volta à data

date --date @120024000


O comando dateé bastante versátil. Outra coisa legal que você pode fazer com a data (copiado descaradamente date --help). Mostrar a hora local para as 9:00 da próxima sexta-feira na costa oeste dos EUA

date --date='TZ="America/Los_Angeles" 09:00 next Fri'

Melhor ainda, leia a página de manual http://man7.org/linux/man-pages/man1/date.1.html

pelucida
fonte
Esta não é a pergunta do OP, mas responde à minha, então +1 de mim.
AnthonyD973 9/02/19
Talvez seja a versão dateou porque estou usando zsh(macOS Catalina), mas isso não funciona para mim. Execução de $ date -d "Oct 21 1973" +%ssaídasusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Joshua Pinter
43

Até agora, todas as respostas usam o programa externo date .

Desde o Bash 4.2, printfhá um novo modificador %(dateformat)Tque, quando usado com argumento, -1gera a data atual com o formato fornecido por dateformat, manipulado por strftime(3)(man 3 strftime para obter informações sobre os formatos).

Portanto, para uma solução Bash pura:

printf '%(%s)T\n' -1

ou se você precisar armazenar o resultado em uma variável var:

printf -v var '%(%s)T' -1

Sem programas externos e sem sub-conchas!

Desde o Bash 4.3, ainda é possível não especificar o -1:

printf -v var '%(%s)T'

(mas pode ser mais sensato sempre apresentar o argumento -1).

Se você usar -2como argumento em vez de -1, o Bash usará a hora em que o shell foi iniciado, em vez da data atual. Isso pode ser usado para calcular tempos decorridos

$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422
gniourf_gniourf
fonte
9
Você deseja usar -2no caso de ter uma tarefa em execução mais longa (pense em um script para controlar seus backups) e enviar um email no final "O backup foi iniciado em $ em vez de concluído em $ now" - o que pode ser feito para -2evitar o armazenamento de um backup. variável dedicada no início.
Sebastian J.
23

Com a maioria das implementações do Awk:

awk 'BEGIN {srand(); print srand()}'
Steven Penny
fonte
21
O que é obscuro?
ericslaw 30/03
8
Uau, tive que ir procurar este aqui. Esta é uma solução pragmática, mas não necessariamente boa / portátil. Parece que as implementações do awksrand() geralmente são propagadas com a data / hora atual. A segunda chamada para srand()retorna o valor usado anteriormente como a semente.
precisa
23

Solução de bash pura

Desde o bash5.0 ( lançado em 7 de janeiro de 2019 ), você pode usar a variável incorporada EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

Há também o EPOCHREALTIMEque inclui frações de segundos.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIMEpode ser convertido em microssegundos (μs) removendo o ponto decimal. Isso pode ser interessante ao usar basha aritmética incorporada (( expression ))que pode lidar apenas com números inteiros.

$ echo ${EPOCHREALTIME/./}
1547624774371215

Em todos os exemplos acima, os valores do tempo impresso são iguais para melhor legibilidade. Na realidade, os valores de tempo diferem, pois cada comando leva uma pequena quantidade de tempo para ser executado.

Socowi
fonte
Para resolução de milissegundos (mesmo formato que date +%s%3N) você pode usarecho $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212
19

Esta é uma extensão do que o @pellucide fez, mas para Macs:

Para determinar o número de segundos desde a época (1º de janeiro de 1970) para qualquer data (por exemplo, 21 de outubro de 1973)

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800

Observe que, para completar, eu adicionei a parte do tempo ao formato. O motivo é que dateele pega qualquer parte da data que você deu e adiciona o atual hora ao valor fornecido. Por exemplo, se você executar o comando acima às 16h19, sem a parte '00: 00: 00 ', ele adicionará a hora automaticamente. Tal que "21 de outubro de 1973" será analisado como "21 de outubro de 1973 16:19:00". Isso pode não ser o que você deseja.

Para converter seu carimbo de data e hora em uma data:

$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973

Página man da Apple para a implementação da data: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

PeqNP
fonte
1
Para deixar claro, isso é para o datecomando do BSD , enquanto quaisquer soluções sugeridas date -dsão para o GNU date. A data do BSD no macOS vem do FreeBSD e compartilha várias opções com o NetBSD e o OpenBSD. E isso é totalmente separado do bash.
precisa saber é
a %Nopção mencionada por segundos fracionários na data do gnu está ausente na data do MacOS. Na versão 10.14, nenhum dos formatos está na página do manual; eles estão na strftime(3)página do manual, que você não terá se não tiver o Xcode instalado e poderá não ver com o comando man, mesmo que tenha.
Dan Pritts
1

use este script bash (meu ~/bin/epoch):

#!/bin/bash

# get seconds since epoch
test "x$1" == x && date +%s && exit 0

# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"
comonad
fonte