retornará o número de segundos desde a época.
retorna os segundos e os nanossegundos atuais.
fornecerá o número de milissegundos desde a época - segundos atuais mais os três à esquerda dos nanossegundos.
e do MikeyB - echo $(($(date +%s%N)/1000000))(dividir por 1000 gera apenas em microssegundos)
Pergunto-me quantos ms o corte acrescenta :-)
Ou se você quiser fazer tudo isso no shell, evitando a sobrecarga cara de um processo adicional (na verdade, estamos evitando o problema quando o número de dígitos em% + s + N for alterado):echo $(($(date +%s%N)/1000))
É o princípio da questão ... evite números mágicos e codifique o que você realmente quer dizer .
Acho que vale a pena notar que o homem pediu o Unix, não o Linux, e a principal resposta atual (data +% s% N) não funciona no meu sistema AIX.
@Pete +1 O mesmo para OS X e FreeBSD
Você pode simplesmente usar %3Npara truncar os nanossegundos para os três dígitos mais significativos (que são, em seguida, milissegundos):
Isso funciona, por exemplo, no meu kubuntu 12.04.
Mas esteja ciente de que isso %Npode não ser implementado dependendo do seu sistema de destino. Por exemplo, testado em um sistema incorporado (rootfs do buildroot, compilado usando uma cadeia de ferramentas cruzada de braço não HF), não havia %N:
(E também o meu tablet Android (não enraizado) não tem %N).
@warren: Vi que você editou e alterou o arquivo 1397392146%3Npara 1397392146%N, mas a saída 1397392146%3Né o que eu realmente tinha visto no console do busybox do meu tablet Android. Você poderia explicar sua edição?
O comentário de warren do histórico é "alterado de 3 para 6, pois 3 leva apenas para microssegundos". Sua edição parece totalmente espúria; você deve reverter.
Este é um recurso do coreUtil GNU especificamente. Por fim, isso é implementado no gnulib aqui: github.com/gagern/gnulib/blob/… .
— telotortium
provavelmente um ponto lá faz sentido. date +%s.%3Nimpressões 1510718281.134.
date +%N não funciona no OS X, mas você pode usar um dos
Pitão: python -c 'import time; print time.time()'
as internets: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
ou por milissegundos arredondados para o segundo mais próximo date +%s000
para completar ...node -e 'console.log(Date.now())'
— slf 10/10
Usando PHP:php -r 'echo microtime(TRUE);'
Claro, você só precisa aguardar o aquecimento dos intérpretes. Isso também funciona:wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
Ou, se você realmente não precisa os milissegundos , mas apenas o formato correto:date +%s000
apple.stackexchange.com/questions/135742/… tem instruções para fazer isso no OSX via Brew'scoreutils
— sameers
Apenas jogando isso lá fora, mas acho que a fórmula correta com a divisão seria:
Minha solução não é a melhor, mas funcionou para mim.
Eu só precisava converter uma data como 05/05/2012 para milissegundos.
— quer tocar hoje?
Você deve ser alguém entre meus colegas de trabalho.
Para as pessoas que sugerem executar programas externos para obter os mili segundos ... nesse ritmo, você também pode fazer o seguinte:
A questão é: antes de escolher qualquer resposta a partir daqui, lembre-se de que nem todos os programas serão executados em menos de um segundo. A medida!
Você não está perguntando ao sistema local sobre o tempo. O que eu acho que está implícito na pergunta. Você também depende de uma conexão de rede.
@orkoden A pergunta pede explicitamente "número de milissegundos desde a época do Unix, em 1º de janeiro de 1970". Além disso, estou mais apontando como você nunca deve acionar Ruby ou Python (ou wget) apenas para ter tempo - isso é feito através de um canal rápido ou milissegundos não importam.
Sim, entendi que você estava dando uma solução pior para destacar as falhas das más soluções. Tentei várias soluções e medi o tempo. lpaste.net/119499 Os resultados são interessantes. Mesmo em uma máquina i7 muito rápida, são datenecessários 3 ms para funcionar.
@orkoden Bom teste! Qual SO? Isso pode ter a ver com a sobrecarga do processo.
@ Nakilon, e é por isso que não se deve confiar em conveniências flexíveis como aquelas para qualquer produção.
Esta solução funciona no macOS.
se você considerar usar um script bash e tiver python disponível, poderá usar este código:
— Frank Thonig
— 22818 Frank Thonig
Não parece particularmente justificado. A dica na seta para baixo diz "Esta resposta não é útil", mas o IMO é útil. Talvez eles quisessem que você o transformasse em um script Python. Isso seria mais simples e também funcionaria bem como um comando bash.
Não se preocupe muito com votos negativos (não era meu) ... especialmente se eles são anônimos (dos quais não se pode aprender o que parece estar errado, certo?). Só para ajudá-lo a processá-lo ... aqui vai outro +1 ... adivinhe: você também tem permissão para "votar" agora, certo?
O voto negativo parece ter sido causado por um problema no sistema. Desde então, foi removido, novamente pelo sistema.
Se você estiver procurando uma maneira de exibir o período de execução do script, o seguinte fornecerá um resultado (não totalmente preciso):
O mais próximo possível do script, digite o seguinte
Isso fornecerá um valor inicial de algo como 1361802943996000000
No final do seu script, use o seguinte
que exibirá algo como
(1 * 10 ^ 09) pode ser substituído por 1000000000 se você desejar
"scale=3"é uma configuração bastante rara que obriga bca fazer o que você deseja. Há muito mais!
Eu só testei isso no Win7 / MinGW ... Não tenho uma caixa * nix adequada à mão.
— user161733
ou você pode simplesmente usartime <script>
Aqui está como obter tempo em milissegundos sem executar a divisão. Talvez seja mais rápido ...
Atualização: Outra alternativa no bash puro que funciona apenas com o bash 4.2+mesmo é acima, mas use printfpara obter a data. Definitivamente, será mais rápido porque nenhum processo é extraído do principal.
Outro problema aqui é que sua strftimeimplementação deve suportar %se %NNÃO é o caso na minha máquina de teste. Veja man strftimepara opções suportadas. Veja também man bashpara ver a printfsintaxe. -1e -2são valores especiais para o tempo.
Parece que o meu strftime(3)não suporta, %Nentão não há como printfimprimir nanossegundos. Estou usando o Ubuntu 14.04.
@haridsv, sim, não está na glibc. dateparece ser a opção mais confiável.
O carimbo de data e hora mais preciso que podemos obter (pelo menos para o Mac OS X) é provavelmente o seguinte:
Mas precisamos ter em mente que leva cerca de 30 milissegundos para ser executado. Podemos reduzi-lo na escala da fração de 2 dígitos e, no início, calcular a sobrecarga média da leitura do tempo e removê-lo da medição. Aqui está um exemplo:
Você pode descomentar os comandos de eco para ver melhor como ele funciona.
Os resultados para este script são geralmente um destes 3 resultados:
Usar date e expr pode levá-lo até lá, ie
Basta expandi-lo para fazer o que quiser
Sei que isso não dá milissegundos desde a época, mas ainda pode ser útil como resposta para alguns casos, tudo depende do que você realmente precisa, multiplique por 1000 se precisar de um número de milissegundos: D
A maneira mais simples seria tornar um pequeno executável (de C f.ex.) e disponibilizá-lo para o script.
Há um problema em potencial executando datevárias vezes. Em alguns casos, a data ou hora pode mudar entre as execuções à medida que seu comando é gravado. É melhor executar dateuma vez, analisar as peças e fazer seu cálculo. Uma das várias maneiras de fazer isso seria t=$(date +%H%M%S); (( x = ${t:0:2} * 3600 + ${t:2:2} * 60 + ${t:4:2} )); echo "$x". Isso usa a sintaxe do Bash, pois a pergunta é marcada como bash . Como você alude, sua resposta (e minha variação) dá apenas segundos para o dia atual até agora e não desde a época nem em milis.
(repetir de cima) date +%Nnão funciona no OS X, mas você também pode usar:
Perl (requer o módulo Time :: Format). Talvez não seja o melhor módulo de CPAN a ser usado, mas faz o trabalho. Time :: Format geralmente é disponibilizado com distribuições.
— TVNshack
O OP pediu especificamente maneiras de fazer isso usando o bash. Como é essa festança, salve como um método para iniciar outra coisa?
Eu uso isso nos meus scripts shell bash ... no OSX. Portanto, datenão pode ser usado e não há comandos somente do bash que atendam à necessidade.
— TVNshack 15/03
Justo. Se você esclarecer por que o OSX datenão pode ser usado como parte de sua resposta , eu removo meu voto negativo.
Isso foi explicado algumas respostas acima. Não pude adicionar como comentário o comando que faltava na lista proposta. Então eu adicionei aqui.
Justo, aceito que essa seja uma adição útil ao cânon. +1 de mim!
Reunindo todas as respostas anteriores, quando estiver no OSX
Se você deseja um cálculo simples de shell, isso é fácil e portátil, usando a resposta acima:
Para linux alpino (muitas imagens do docker) e possivelmente outros ambientes linux mínimos, você pode abusar adjtimex:
adjtimexé usado para ler (e definir) variáveis ​​de tempo do kernel. Com awkvocê pode obter os microssegundos, headvocê pode usar apenas os 3 primeiros dígitos.