Comment puis-je générer des horodatages Unix?

240

La question connexe est "Horodatage Datetime To Unix" , mais cette question est plus générale.

J'ai besoin d'horodatages Unix pour résoudre ma dernière question. Mes intérêts sont Python, Ruby et Haskell, mais d'autres approches sont les bienvenues.

Quelle est la façon la plus simple de générer des horodatages Unix?

Léo Léopold Hertz 준영
la source
J'ai créé un outil en ligne il y a quelque temps. quickhash.com/timestamp
AB Carroll
@ABCarroll Pouvez-vous expliquer en réponse comment votre outil en ligne fournit des horodatages Unix? Veuillez joindre un manuel, etc. pour cela. Il semble fournir beaucoup de données mais je ne peux pas vraiment suivre quel est l'objectif.
Léo Léopold Hertz 준영
gettimeofdayest le nom de l'appel système POSIX et Linux: stackoverflow.com/questions/11765301/… TODO: pourquoi strace date +%dne pas l'appeler?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Si vous travaillez avec et incrémentez des plages de temps (par exemple minutes, jours, heures), j'ai récemment écrit un outil pour mon usage personnel unixtime.ninja
Guy Thouret

Réponses:

472

Sous Linux ou MacOS, vous pouvez utiliser:

date +%s

  • +%s, secondes depuis le 01-01-1970 00:00:00 UTC. (Manuel de date GNU Coreutils 8.24)

Exemple de sortie maintenant 1454000043.

Naresh
la source
1
Sous Solaris: truss date 2> & 1 | grep ^ temps | awk '{print $ 3}'
Ľubomír Mlích
La date BSD prend également en charge +% s. Probablement universel, comme cela dateest normalement défini dans POSIX.2.
Dereckson
@ ĽubomírMlích Sur un hôte SmartOS (SunOS 5.11 joyent_20171026T003127Z), j'ai les deux /usr/bin/date +%s and / usr / xpg4 / bin / date +% s` fonctionnant. Combiné avec la recommandation POSIX.2, je pense que cela fonctionne aussi sur tous les Solaris.
Dereckson
Remarque: pour ajouter 60 secondes: date -v+60S +%spour ajouter 1 jour: date -v+24H +%set ainsi de suite. . .
gMale
Comment générer des millisecondes jusqu'à 3 chiffres seulement?
Parveen Verma
110

en Ruby:

>> Time.now.to_i
=> 1248933648
bb.
la source
pour les rails que vous pouvez utiliser Time.zone.now.to_i. Bien que cela donne le même o / p que Time.now.to)_imais Time.zone.now.to_ic'est le Railschemin.
Swaps
Dans Rails, ./bin/rails runner "p Time.current.to_i"c'est une autre solution.
gipcompany
18

En python, ajoutez les lignes suivantes pour obtenir un horodatage:

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

curl icanhazepoch.com

Fondamentalement, ce sont les horodatages Unix en tant que service (UTaaS)

Hut8
la source
3
Hé, bien. Cela m'a inspiré pour ajouter une fonctionnalité similaire à mon site de loisirs. curl -L -H "Accept: application/json" unixtimesta.mpvous donnera{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Craig Anderson
12

En Perl:

>> time
=> 1335552733
davidchambers
la source
8

La commande unix 'date' est étonnamment polyvalente.

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

Prend la sortie de date, qui sera au format défini par -f, puis l'imprime (-j dit de ne pas tenter de définir la date) sous la forme +% s, secondes depuis epoch.

Alan Horn
la source
4
date: invalid option -- 'j'
nyuszika7h
1
C'est une extension de date GNU, pas dans la norme Unix (POSIX).
jlliagre
8
$ date +%s.%N

où (manuel de date GNU Coreutils 8.24)

  • +%s, secondes depuis le 1970-01-01 00:00:00 UTC
  • +%N, nanosecondes (000000000..999999999) depuis l'époque

Exemple de sortie maintenant 1454000043.704350695. J'ai remarqué que le manuel BSD datene comprenait pas d'explication précise sur le drapeau +%s.

Masi
la source
Pourquoi incluez-vous les nanosecondes par +$N? Est-il inclus dans l'horodatage UNIX dans certains systèmes?
Léo Léopold Hertz
2
Pour info, %Nla page de manuel de date n'est pas documentée dans macOS 10.13.1 (High Sierra) et ne fonctionne pas. L'exemple de sortie je suis arrivé est: 1523342391.N.
nishanths
Sur macOS, il y a gdatedans Homebrew apple.stackexchange.com/a/135749/181223
phil pirozhkov
7

Tout d'abord, `` l'époque '' ou l'heure zéro Unix est 1970-01-01 00: 00: 00Z (ce qui signifie minuit du 1er janvier 1970 dans le fuseau horaire zoulou ou GMT ou UTC). Un horodatage Unix est le nombre de secondes écoulées depuis ce temps - sans tenir compte des secondes intercalaires.

Générer l'heure actuelle en Perl est assez simple:

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

La génération de l'heure correspondant à une valeur date / heure donnée est plutôt moins aisée. Logiquement, vous utilisez la strptime()fonction de POSIX. Cependant, le module Perl POSIX :: strptime (qui est distinct du module POSIX) a la signature:

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

La fonction mktimedu module POSIX a la signature:

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

Donc, si vous connaissez le format de vos données, vous pouvez écrire une variante sur:

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

Pour être complet, PHP:

php -r 'echo time();'

En BASH:

clitime=$(php -r 'echo time();')
echo $clitime
Mike Mackintosh
la source
1
pour bash, nous avons déjà la datecommande, donc je ne pense pas qu'il soit nécessaire d'appeler php à partir de là.
fedorqui 'SO arrête de nuire'
3

à Haskell

import Data.Time.Clock.POSIX

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

à Go

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

en 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);

à Swift

NSDate().timeIntervalSince1970 // or Date().timeIntervalSince1970
ZagNut
la source
2

À Haskell ...

Pour le récupérer en tant que type POSIXTime:

import Data.Time.Clock.POSIX
getPOSIXTime

En entier:

import Data.Time.Clock.POSIX
round `fmap` getPOSIXTime
Tom Morris
la source
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
la source
2

Essayons JavaScript :

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

... ou encore mieux, l'approche statique:

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

Dans les deux cas, je divise par 1000pour passer des secondes aux millis et je Math.floorne représente que des secondes entières qui se sont écoulées (par rapport à l'arrondi, qui peut arrondir à une seconde entière qui ne s'est pas encore écoulée).

Madbreaks
la source
C'est faux. Les deux méthodes millisecondsne retournent pas des secondes et l'horodatage Unix est le nombre de celles secondsqui se sont écoulées depuis le 1er janvier 1970 à 00h00 UTC. Vous pouvez utiliser JS, divisez simplement par 1000 et arrondissez:Math.round(Date.now()/1000)
Lukas Liesis
1
@LukasLiesis été pré-dű ętre café ce jour - là, je l' ai mis à jour ma réponse , bien que j'ai opté pour la Math.floorplace de Math.round. Acclamations
Madbreaks
0

Si vous avez besoin d'un horodatage Unix à partir d'un script shell (famille Bourne: sh, ksh, bash, zsh, ...), cela devrait fonctionner sur n'importe quelle machine Unix contrairement aux autres suggestions (perl, haskell, ruby, python, GNU date ), il est basé sur une commande et une fonctionnalité standard POSIX.

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

Dans Bash 5, il y a une nouvelle variable:

echo $EPOCHSECONDS

Ou si vous souhaitez une précision plus élevée (en microsecondes):

echo $EPOCHREALTIME
Colera Su
la source
0

Si je veux imprimer l'heure de la date utc en utilisant la commande date, je dois utiliser l'argument -u avec la commande date.

Exemple

date -u

Production

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

nawk:

$ nawk 'BEGIN{print srand()}'
  • Fonctionne même sur les anciennes versions de Solaris et probablement d'autres systèmes UNIX, où '' 'date +% s' '' n'est pas implémenté
  • Ne fonctionne pas sur Linux et autres distributions où les outils posix ont été remplacés par les versions GNU (nawk -> gawk etc.)
  • Assez peu intuitif mais définitivement amusant :-)
pez
la source
-1

Avec NodeJS, ouvrez simplement un terminal et tapez:
node -e "console.log(new Date().getTime())"ounode -e "console.log(Date.now())"

Dusan Jovanov
la source