2009-07-07 9 views
396

J'ai besoin de quelque chose de simple comme date, mais en secondes depuis 1970 au lieu de la date actuelle, heures, minutes et secondes.Obtenir l'heure actuelle en secondes depuis l'époque sur Linux, Bash

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

+18

Désolé, je dois dire que cela .... '' Date ne semble pas offrir cette option. Y a-t-il un moyen facile? '' - relisez le manuel ;-) – TheBonsai

+5

Certaines versions de date l'ont et d'autres non. Donc ce n'est pas toujours présent. J'ai couru le 'type -a date' et ai utilisé une version différente et cela a fonctionné. –

+0

FWIW, Ubuntu a seulement/bin/date, pour laquelle la réponse de @ Steef fonctionne –

Répondre

747

Cela devrait fonctionner:

date +%s 
+27

la date mangge doit être changé de '% s secondes depuis 1970-01-01 00:00:00 UTC' à'% s secondes depuis l'époque , 1970-01-01 00:00:00 UTC' parce que j'ai raté là-bas. – devin

+3

Ne fonctionne pas pour moi. date de l'homme ne montre pas% s. Je dois avoir une version très ancienne de bash (3.2.51 (1) pour Solaris)? – livefree75

+3

@ livefree75 'date' n'est pas construit dans' bash', donc votre version de 'bash' n'a rien à voir avec l'implémentation' date' de votre système. –

91

Juste pour ajouter. Si vous voulez obtenir les secondes depuis l'époque (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 de retour à ce jour

date --date @120024000 


La commande date est assez polyvalent. Une autre chose cool que vous pouvez faire avec la date (copié 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 man http://www.manpages.info/linux/date.1.html

14

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

pour déterminer le nombre de secondes écoulées depuis l'époque (1 janvier 1970) pour une date donnée (par exemple, 21 oct 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 temps au format. La raison en est que prendra n'importe quelle partie de 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. Tel que "21 Octobre 1973" sera analysé comme "21 octobre 1973 16:19:00". Ce n'est peut-être pas ce que vous voulez.

Pour convertir votre horodatage de retour à une date:

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

page de manuel d'Apple pour la mise en œuvre de ce jour: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

23

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

Ainsi, pour une solution pure Bash:

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

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

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

Aucun programme externe ni sous-couches!

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

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

(mais il pourrait être plus sage de donner toujours 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?).

+4

Vous voulez utiliser' -2' si vous avez un travail plus long (pensez à un script pour contrôlez vos sauvegardes) et envoyez un mail à la fin "Sauvegarde commencée à $ quelquechose terminé à $ maintenant" - ce qui peut être accompli avec "-2" en évitant de stocker une variable dédiée au début. –

1

utiliser 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" "[email protected]" 
6

Avec la plupart des implémentations awk:

awk 'BEGIN {srand(); print srand()}' 
+4

Wow c'est obscur – ericslaw

+1

Wow, a dû aller chercher celui-ci. C'est une solution pragmatique, mais pas nécessairement bonne/portable. [Il semblerait que les implémentations de awk 'srand()'] (https://www.gnu.org/software/gawk/manual/html_node/Numeric-Functions.html) sont généralement lancées avec la date et l'heure actuelles. Le second appel à 'srand()' renvoie la valeur précédemment utilisée comme graine. –

Questions connexes