Como posso gerar registros de data e hora do Unix?

240

A pergunta relacionada é "Data e hora para Unix" , mas essa pergunta é mais geral.

Preciso de carimbos de data e hora do Unix para resolver minha última pergunta. Meus interesses são Python, Ruby e Haskell, mas outras abordagens são bem-vindas.

Qual é a maneira mais fácil de gerar registros de data e hora do Unix?

Léo Léopold Hertz 준영
fonte
Eu fiz uma ferramenta online há algum tempo. quickhash.com/timestamp
AB Carroll
@ABCarroll Você pode explicar como uma resposta como sua ferramenta on-line fornece registros de data e hora para Unix? Por favor, anexe um manual etc para isso. Parece fornecer muitos dados, mas não consigo realmente seguir qual é o objetivo.
Léo Léopold Hertz · 15/06
gettimeofdayé o nome do syscall do POSIX e Linux: stackoverflow.com/questions/11765301/… TODO: por que strace date +%dnão chamá-lo?
Ciro Santilli # 7/17
Se você trabalhar com, e intervalos de tempo de incremento (por exemplo, minutos, dias, horas), eu escrevi uma ferramenta para meu próprio uso recentemente unixtime.ninja
Guy Thouret

Respostas:

472

No Linux ou MacOS, você pode usar:

date +%s

Onde

  • +%s, segundos desde 1970-01-01 00:00:00 UTC. (Manual do GNU Coreutils 8.24 Date)

Exemplo de saída agora 1454000043.

Naresh
fonte
1
No Solaris: data da treliça 2> & 1 | grep ^ time | awk '{print $ 3}'
Mubomír Mlích
A data do BSD também suporta +% s. Provavelmente universal, como dateé normalmente definido no POSIX.2.
Dereckson
@ OmubomírMlích Em um host SmartOS (SunOS 5.11 joyent_20171026T003127Z), eu tenho ambos /usr/bin/date +%s and / usr / xpg4 / bin / date +% s` trabalhando. Combinado com a recomendação POSIX.2, acho que isso funciona com todos os Solaris também.
Dereckson
Nota: para adicionar 60 segundos: date -v+60S +%spara adicionar 1 dia: date -v+24H +%se assim por diante. . .
gMale
Como gerar milissegundos até 3 dígitos apenas?
Parveen Verma
110

em Ruby:

>> Time.now.to_i
=> 1248933648
bb.
fonte
para trilhos você pode usar Time.zone.now.to_i. Embora dê o mesmo o / p de Time.now.to)_imas Time.zone.now.to_ié o Railscaminho.
Troca
No Rails, ./bin/rails runner "p Time.current.to_i"é outra solução.
Gipcompany
18

Em python, adicione as seguintes linhas para obter um carimbo de hora:

>>> import time
>>> time.time()
1335906993.995389
>>> int(time.time())
1335906993
Steven Kryskalla
fonte
17

curl icanhazepoch.com

Basicamente, são timestamps unix como serviço (UTaaS)

Hut8
fonte
3
Heh, legal. Isso me inspirou a adicionar um recurso semelhante ao meu site de hobby. curl -L -H "Accept: application/json" unixtimesta.mpvai dar{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Craig Anderson
12

Em Perl:

>> time
=> 1335552733
davidchambers
fonte
8

O comando unix 'date' é surpreendentemente versátil.

data -j -f "% a% b% d% T% Z% Y" "` data` "" +% s "

Pega a saída de date, que estará no formato definido por -f, e a imprime (-j diz que não tente definir a data) no formato +% s, segundos desde a época.

Alan Horn
fonte
4
date: invalid option -- 'j'
precisa saber é o seguinte
1
Essa é uma extensão de data do GNU, não no padrão Unix (POSIX).
Jlliagre
8
$ date +%s.%N

where (GNU Coreutils 8.24 Date manual)

  • +%s, segundos desde 1970-01-01 00:00:00 UTC
  • +%N, nanossegundos (000000000..999999999) desde a época

Exemplo de saída agora 1454000043.704350695. Notei que o manual do BSD datenão incluía explicações precisas sobre a bandeira +%s.

Masi
fonte
Por que você inclui nanossegundos por +$N? Está incluído no registro de data e hora do UNIX em alguns sistemas?
Léo Léopold Hertz # 29/16
2
Para sua informação, %Nnão está documentada a página de manual para data no macOS 10.13.1 (High Sierra) e não funciona. A saída de exemplo que eu tenho é: 1523342391.N.
Nishanths
No MacOS há gdateno Homebrew apple.stackexchange.com/a/135749/181223
phil Pirozhkov
7

Primeiro, a época do Unix ou o tempo zero é 1970-01-01 00: 00: 00Z (ou seja, meia-noite de 1º de janeiro de 1970 no fuso horário Zulu, GMT ou UTC). Um registro de data e hora do Unix é o número de segundos desde esse horário - sem contabilizar os segundos bissextos.

Gerar o horário atual no Perl é bastante fácil:

perl -e 'print time, "\n"'

Gerar a hora correspondente a um determinado valor de data / hora é um pouco menos fácil. Logicamente, você usa a strptime()função do POSIX. No entanto, o módulo Perl POSIX :: strptime (que é separado do módulo POSIX) possui a assinatura:

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = 
                                     POSIX::strptime("string", "Format");

A função mktimeno módulo POSIX possui a assinatura:

mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)

Portanto, se você conhece o formato dos seus dados, pode escrever uma variante em:

perl -MPOSIX -MPOSIX::strptime -e \
    'print mktime(POSIX::strptime("2009-07-30 04:30", "%Y-%m-%d %H:%M")), "\n"'
Jonathan Leffler
fonte
4

Para completar, PHP:

php -r 'echo time();'

No BASH:

clitime=$(php -r 'echo time();')
echo $clitime
Mike Mackintosh
fonte
1
para o bash já temos o datecomando, então não acho necessário chamar php a partir daí.
fedorqui 'Então, pare de prejudicar'
3

em Haskell

import Data.Time.Clock.POSIX

main :: IO ()
main = print . floor =<< getPOSIXTime

em Go

import "time"
t := time.Unix()

em C

time(); // in time.h POSIX

// for Windows time.h
#define UNIXTIME(result)   time_t localtime; time(&localtime); struct tm* utctime = gmtime(&localtime); result = mktime(utctime);

em Swift

NSDate().timeIntervalSince1970 // or Date().timeIntervalSince1970
ZagNut
fonte
2

Em Haskell ...

Para recuperá-lo como um tipo POSIXTime:

import Data.Time.Clock.POSIX
getPOSIXTime

Como um número inteiro:

import Data.Time.Clock.POSIX
round `fmap` getPOSIXTime
Tom Morris
fonte
2
public static Int32 GetTimeStamp()
    {
        try
        {
            Int32 unixTimeStamp;
            DateTime currentTime = DateTime.Now;
            DateTime zuluTime = currentTime.ToUniversalTime();
            DateTime unixEpoch = new DateTime(1970, 1, 1);
            unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds;
            return unixTimeStamp;
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
            return 0;
        }
    }
Rúben Jerónimo
fonte
2

Vamos tentar o JavaScript :

var t = Math.floor((new Date().getTime()) / 1000);

... ou ainda melhor, a abordagem estática:

var t = Math.floor(Date.now() / 1000);

Nos dois casos, divido 1000para ir de segundos a milis e uso Math.floorapenas para representar segundos inteiros que passaram (vs. arredondamento, que pode arredondar para um segundo inteiro que ainda não passou).

Madbreaks
fonte
Isto está errado. Os dois métodos retornam millisecondsnão segundos e o carimbo de data e hora unix é o número secondsdecorrido desde 1 de janeiro de 1970 00:00 UTC. Você pode usar JS, basta dividir por 1000 e arredondar:Math.round(Date.now()/1000)
Lukas Liesis 06/06
1
@LukasLiesis deve ter sido pré-café naquele dia, eu atualizei minha resposta, embora tenha optado por em Math.floorvez de Math.round. Cheers
Madbreaks
0

Se você precisar de um registro de data e hora do Unix a partir de um script de shell (família Bourne: sh, ksh, bash, zsh, ...), isso deve funcionar em qualquer máquina Unix, ao contrário das outras sugestões (perl, haskell, ruby, python, data GNU) ), baseia-se em um comando e recurso padrão POSIX.

PATH=`getconf PATH` awk 'BEGIN {srand();print srand()}'
jlliagre
fonte
0

No Bash 5, há uma nova variável:

echo $EPOCHSECONDS

Ou se você deseja maior precisão (em microssegundos):

echo $EPOCHREALTIME
Colera Su
fonte
0

Se eu quiser imprimir utc date time usando o comando date, preciso usar o argumento -u com o comando date.

Exemplo

date -u

Resultado

Fri Jun 14 09:00:42 UTC 2019
Viraj Wadate
fonte
0

nawk:

$ nawk 'BEGIN{print srand()}'
  • Funciona mesmo em versões antigas do Solaris e provavelmente em outros sistemas UNIX, onde '' 'date +% s' '' não é implementado
  • Não funciona no Linux e em outras distros em que as ferramentas posix foram substituídas pelas versões GNU (nawk -> gawk etc.)
  • Bastante intuitivo, mas definitivamente divertido :-)
pez
fonte
-1

Com o NodeJS, basta abrir um terminal e digite:
node -e "console.log(new Date().getTime())"ounode -e "console.log(Date.now())"

Dusan Jovanov
fonte