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?


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.


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

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

17

curl icanhazepoch.com

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


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


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.


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.


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


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"'


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

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

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;
        }
    }

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).


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()}'

0

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

echo $EPOCHSECONDS

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

echo $EPOCHREALTIME

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

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 :-)

-1

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.