web-dev-qa-db-fra.com

Obtenir le temps actuel en secondes depuis l’époque sous Linux, Bash

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

date ne semble pas offrir cette option. Y a-t-il un moyen facile?

546
n-alexander

Cela devrait fonctionner:

date +%s
1004
Steef

Juste pour ajouter.

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

date -d "Oct 21 1973" +%s


Convertir le nombre de secondes à ce jour

date --date @120024000


La commande date est assez polyvalente. Une autre chose intéressante que vous pouvez faire avec la date (copiée sans vergogne de date --help). Afficher l'heure locale pour 9 heures 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

117
pellucide

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

Depuis Bash 4.2, printf a un nouveau modificateur %(dateformat)T qui, lorsqu'il est utilisé avec l'argument -1, affiche la date actuelle avec le format donné par dateformat, géré par strftime(3). (man 3 strftime pour des informations sur les formats).

Donc, pour une solution Bash pure:

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

ou si vous avez besoin de stocker le résultat dans une variable var:

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

Aucun programme externe et aucun sous-shell!

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

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

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

Si vous utilisez -2 comme argument au lieu de -1, Bash utilisera l'heure à laquelle le shell a été démarré au lieu de la date actuelle (mais pourquoi voudriez-vous cela?).

33
gniourf_gniourf

Avec la plupart des implémentations d'Awk:

awk 'BEGIN {srand(); print srand()}'
17
Steven Penny

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

Déterminer le nombre de secondes écoulées depuis Epoch (1er janvier 1970) pour une date donnée (par exemple le 21 octobre 1973).

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

Veuillez noter que, par souci d'exhaustivité, j'ai ajouté la partie heure au format. La raison en est que date prendra la date que vous lui avez donnée et ajoutera le temps actuel à la valeur fournie. Par exemple, si vous exécutez la commande ci-dessus à 16h19, sans la partie '00: 00: 00 ', l'heure sera automatiquement ajoutée. Ainsi, "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

17
PeqNP

Solution pure bash

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

$ echo $EPOCHSECONDS
1547624774

Il y a aussi EPOCHREALTIME qui inclut des fractions de secondes.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIME peut être converti en micro-secondes (μs) en supprimant le point décimal. Cela pourrait être intéressant lorsque vous utiliserez l'arithmétique intégrée de bash(( 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 temporelles seraient différentes car chaque commande prend un peu de temps pour être exécutée.

11
Socowi

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" "$@"
0
comonad