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?
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.
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'
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
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.
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)
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 ê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""$@"
Réponses:
Cela devrait fonctionner:
la source
%s seconds since 1970-01-01 00:00:00 UTC
à%s seconds since the epoch, 1970-01-01 00:00:00 UTC
parce que je l'ai manqué là-dedans.date
n'est pas intégrébash
, donc votre version debash
n'a rien à voir avec l'date
implémentation de votre système.date +%s.%N
date +%s%3N
Juste pour ajouter.
Obtenez les secondes depuis l'époque (1er janvier 1970) pour une date donnée (par exemple 21 octobre 1973).
Convertir le nombre de secondes à ce jour
La commande
date
est assez polyvalente. Une autre chose sympa que vous pouvez faire avec la date (copiée sans vergognedate --help
). Afficher l'heure locale de 9h vendredi prochain sur la côte ouest des États-UnisMieux encore, prenez le temps de lire la page de manuel http://man7.org/linux/man-pages/man1/date.1.html
la source
date
ou parce que j'utilisezsh
(macOS Catalina) mais cela ne fonctionne pas pour moi. Exécution de$ date -d "Oct 21 1973" +%s
sortiesusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
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 un argument , affiche-1
la date actuelle au format donné pardateformat
, gérée parstrftime(3)
(man 3 strftime
pour des informations sur les formats).Donc, pour une solution Bash pure:
ou si vous devez stocker le résultat dans une variable
var
:Pas de programmes externes et pas de sous-coquilles!
Depuis Bash 4.3, il est même possible de ne pas spécifier
-1
:(mais il serait peut-être plus sage de toujours donner l'argument
-1
).Si vous utilisez
-2
comme 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ésla source
-2
dans 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.Solution de bash pure
Depuis la version
bash
5.0 ( publiée le 7 janvier 2019 ), vous pouvez utiliser la variable intégréeEPOCHSECONDS
.Il y a aussi
EPOCHREALTIME
qui comprend des fractions de secondes.EPOCHREALTIME
peut être converti en microsecondes (μs) en supprimant le point décimal. Cela peut être intéressant lors de l'utilisationbash
de l'arithmétique intégrée(( expression ))
qui ne peut gérer que des entiers.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.
la source
date +%s%3N
), vous pouvez utiliserecho $(( ${EPOCHREALTIME/./} / 1000 ))
Avec la plupart des implémentations Awk:
la source
srand()
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.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)
Veuillez noter que pour être complet, j'ai ajouté la partie heure au format. La raison en est que
date
cela 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:
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
la source
date
commande de BSD , alors que toutes les solutions suggéréesdate -d
sont pour GNUdate
. 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.%N
option 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 lastrftime(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.utilisez ce script bash (mon
~/bin/epoch
):la source