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?


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.


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

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

17

curl icanhazepoch.com

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


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


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.


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.


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

4

Pour être complet, PHP:

php -r 'echo time();'

En BASH:

clitime=$(php -r 'echo time();')
echo $clitime

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

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

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

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


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

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

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

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

-1

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.