Obtenez l'heure actuelle en secondes depuis l'Epoch sur Linux, Bash

634

J'ai besoin de quelque chose de simple date, mais en quelques secondes depuis 1970 au lieu de la date, des heures, des minutes et des secondes actuelles.

datene semble pas offrir cette option. Existe-t-il un moyen simple?

n-alexander
la source
22
Désolé, je dois dire ceci ... '' La date ne semble pas offrir cette option. Y a-t-il un moyen facile? ''
relisez
7
Certaines versions de date l'ont et d'autres non. Ce n'est donc pas toujours présent. J'ai couru 'type -a date' et utilisé une version différente et cela a fonctionné.
Scott Rowley
1
FWIW, Ubuntu n'a que / bin / date, pour lequel la réponse de @ Steef fonctionne
Jonathan Hartley
1
@TheBonsai qui ne fait pas partie de la version standard POSIX de l'outil 'date'. Tout simplement parce que votre version l'a (probablement GNU), vous ne devriez pas supposer que les implémentations de tout le monde le font.
Wyatt8740

Réponses:

1160

Cela devrait fonctionner:

date +%s
Steef
la source
45
le manpge de date devrait être changé de %s seconds since 1970-01-01 00:00:00 UTCà %s seconds since the epoch, 1970-01-01 00:00:00 UTCparce que je l'ai manqué là-dedans.
devin
3
Ça ne marche pas pour moi. date de l'homme n'affiche pas% s. Je dois avoir une très ancienne version de bash (3.2.51 (1) pour Solaris)?
livefree75
7
@ livefree75 daten'est pas intégré bash, donc votre version de bashn'a rien à voir avec l' dateimplémentation de votre système.
Adrian Frühwirth
11
Et si vous voulez les fractions de seconde, à neuf décimales près, utilisez:date +%s.%N
Jonathan Hartley
19
Pour une utilisation en millisecondesdate +%s%3N
Juan Campa
133

Juste pour ajouter.

Obtenez les secondes depuis l'époque (1er janvier 1970) pour une date donnée (par exemple 21 octobre 1973).

date -d "Oct 21 1973" +%s


Convertir le nombre de secondes à ce jour

date --date @120024000


La commande dateest assez polyvalente. Une autre chose sympa que vous pouvez faire avec la date (copiée sans vergogne date --help). Afficher l'heure locale de 9h vendredi prochain sur la côte ouest des États-Unis

date --date='TZ="America/Los_Angeles" 09:00 next Fri'

Mieux encore, prenez le temps de lire la page de manuel http://man7.org/linux/man-pages/man1/date.1.html

pellucide
la source
Ce n'est pas la question du PO, mais elle répond à la mienne, donc +1 de ma part.
AnthonyD973
C'est peut-être la version de dateou parce que j'utilise zsh(macOS Catalina) mais cela ne fonctionne pas pour moi. Exécution de $ date -d "Oct 21 1973" +%ssortiesusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Joshua Pinter
43

Jusqu'à présent, toutes les réponses utilisent le programme externe date.

Depuis Bash 4.2, printfa un nouveau modificateur %(dateformat)Tqui, lorsqu'il est utilisé avec un argument , affiche -1la date actuelle au format donné par dateformat, gérée par strftime(3)( man 3 strftimepour des informations sur les formats).

Donc, pour une solution Bash pure:

printf '%(%s)T\n' -1

ou si vous devez stocker le résultat dans une variable var:

printf -v var '%(%s)T' -1

Pas de programmes externes et pas de sous-coquilles!

Depuis Bash 4.3, il est même possible de ne pas spécifier -1:

printf -v var '%(%s)T'

(mais il serait peut-être plus sage de toujours donner l'argument -1).

Si vous utilisez -2comme argument au lieu de -1, Bash utilisera l'heure de démarrage du shell au lieu de la date actuelle. Cela peut être utilisé pour calculer les temps écoulés

$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422
gniourf_gniourf
la source
9
Vous souhaitez utiliser -2dans le cas où vous avez un travail plus long (pensez à un script pour contrôler vos sauvegardes) et envoyer un e-mail à la fin "Sauvegarde démarrée à $ une fois terminée à $ maintenant" - ce qui peut être accompli en -2évitant de stocker un variable dédiée au début.
Sebastian J.
24

Solution de bash pure

Depuis la version bash5.0 ( publiée le 7 janvier 2019 ), vous pouvez utiliser la variable intégrée EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

Il y a aussi EPOCHREALTIMEqui comprend des fractions de secondes.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIMEpeut être converti en microsecondes (μs) en supprimant le point décimal. Cela peut être intéressant lors de l'utilisation bashde l'arithmétique intégrée (( expression ))qui ne peut gérer que des entiers.

$ echo ${EPOCHREALTIME/./}
1547624774371215

Dans tous les exemples ci-dessus, les valeurs de temps imprimées sont égales pour une meilleure lisibilité. En réalité, les valeurs de temps seraient différentes car chaque commande prend un peu de temps pour être exécutée.

Socowi
la source
Pour une résolution en millisecondes (même format que date +%s%3N), vous pouvez utiliserecho $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212
23

Avec la plupart des implémentations Awk:

awk 'BEGIN {srand(); print srand()}'
Steven Penny
la source
21
Wow c'est obscur
ericslaw
8
Wow, a dû aller chercher celui-ci. Il s'agit d'une solution pragmatique, mais pas nécessairement bonne / portable. Il semble que les implémentations de awksrand() soient généralement prédéfinies avec la date / heure actuelle. Le deuxième appel à srand()renvoie la valeur précédemment utilisée comme valeur de départ.
Ryan Ransford
19

Ceci est une extension de ce que @pellucide a fait, mais pour les Mac:

Pour déterminer le nombre de secondes depuis l'époque (1er janvier 1970) pour une date donnée (par exemple 21 octobre 1973)

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800

Veuillez noter que pour être complet, j'ai ajouté la partie heure au format. La raison en est que datecela prendra n'importe quelle partie de date que vous lui avez donnée et ajoutera l' heure actuelle à la valeur fournie. Par exemple, si vous exécutez la commande ci-dessus à 16h19, sans la partie '00: 00: 00 ', elle ajoutera l'heure automatiquement. Tels que "21 octobre 1973" sera analysé comme "21 octobre 1973 16:19:00". Ce n'est peut-être pas ce que vous voulez.

Pour reconvertir votre horodatage en date:

$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973

Page de manuel d'Apple pour l'implémentation de la date: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

PeqNP
la source
1
Pour être clair, c'est pour la datecommande de BSD , alors que toutes les solutions suggérées date -dsont pour GNU date. La date BSD dans macOS provient de FreeBSD et partage un certain nombre d'options avec NetBSD et OpenBSD. Et cela est entièrement distinct de bash.
ghoti
l' %Noption mentionnée pour les fractions de seconde dans la date gnu est absente de la date MacOS. Le 10.14, aucun des formats n'est dans la page de manuel; ils sont dans la strftime(3)page de manuel, que vous n'aurez pas si vous n'avez pas installé Xcode, et pourrait ne pas voir avec la commande man même si vous le faites.
Dan Pritts
1

utilisez ce script bash (mon ~/bin/epoch):

#!/bin/bash

# get seconds since epoch
test "x$1" == x && date +%s && exit 0

# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"
comonad
la source