Date au format AAAA-MM-JJ dans le script shell

1112

J'ai essayé d'utiliser $(date)dans mon script shell bash, cependant, je veux la date au YYYY-MM-DDformat.
Comment est-ce que j'obtiens ceci?

Kapsh
la source

Réponses:

1832

Dans bash (> = 4.2), il est préférable d'utiliser le formateur de date intégré de printf (partie de bash) plutôt que l'externe date(généralement la date GNU).

En tant que tel:

# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1 

# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 

# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal

En bash (<4.2):

# put current date as yyyy-mm-dd in $date
date=$(date '+%Y-%m-%d')

# put current date as yyyy-mm-dd HH:MM:SS in $date
date=$(date '+%Y-%m-%d %H:%M:%S')

# print current date directly
echo $(date '+%Y-%m-%d')

D'autres formats de date disponibles peuvent être consultés à partir des pages de manuel de date (pour la commande externe non spécifique à bash):

man date
Philip Fourie
la source
4
Dans les premiers jours du mois, je reçois "2012-07-1", ce qui n'est pas ce que le PO demande.
DerMike
6
Cela fonctionne pour moi. La page de manuel suggère que le premier du mois est 01, no 1 (Ex. 2012-07-01).
Bob Kuhar
31
DATE = $ (date +% d-% m-% Y ""% H:% M:% S); Ce que j'ai fini après.
JacopKane
5
Je n'ai pas vérifié la disponibilité de ces raccourcis, mais dans certaines distributions, vous pouvez les utiliser +%F %Tcomme raccourci +%Y-%m-%d %H:%M:%S. Notez simplement que certains systèmes de fichiers (toux ** HFS) convertiront le :en un /, vous donnant une chaîne comme celle 2016-09-15 11/05/00qui est très déroutante.
Beporter
24
La syntaxe préférée dans tout shell compatible POSIX en ce millénaire est à la date=$(date)place de date=`date`. N'utilisez pas non plus de majuscules pour vos variables privées; les noms de variables majuscules sont réservés au système.
tripleee
335

Essayer: $(date +%F)

kwatford
la source
12
Les pages de manuel pour la date indiquent:% F date complète; identique à% Y-% m-% d, il s'agit donc simplement d'une notation plus compacte pour la réponse acceptée.
Håvard Geithus
92

Vous pouvez faire quelque chose comme ça:

$ date +'%Y-%m-%d'
Annuler
la source
47

Vous recherchez le format de date standard ISO 8601 , donc si vous avez une date GNU (ou toute commande de date plus moderne que 1988), faites simplement:$(date -I)

Médiéviste
la source
9
J'ai un ordinateur Mac OS X récent (> 1988) et je date -In'ai pas fonctionné. Ayant installé GNU coreutils en utilisant brew (qui utilise le préfixe «g») gdate -Ia fonctionné.
Joel Purra
3
Impair. Je ne trouve pas l' -Ioption documentée pour GNU date, bien que cela semble être équivalent à date +%F.
chepner
3
OS X est généralement une friche GPL v3, il se peut donc qu'ils n'aient tout simplement pas mis à jour la date ou BASH récemment.
Indolering
20
date -d '1 hour ago' '+%Y-%m-%d'

La sortie serait 2015-06-14.

xu2mao
la source
3
Mal pour plusieurs raisons, cela donne évidemment la mauvaise date entre 00:00 et 01:00, et en plus vous vous retrouvez avec un %.
Gerhard Burger
ce n'est pas vrai. devrait être comme cette citation simple clairsemée
Beyhan Gül
20
$(date +%F_%H-%M-%S)

peut être utilisé pour supprimer les deux-points (:) entre les deux

production

2018-06-20_09-55-58
ahmettolga
la source
19

Avec Bash récent (version ≥ 4.2), vous pouvez utiliser le module intégré printfavec le modificateur de format %(strftime_format)T:

$ printf '%(%Y-%m-%d)T\n' -1  # Get YYYY-MM-DD (-1 stands for "current time")
2017-11-10
$ printf '%(%F)T\n' -1  # Synonym of the above
2017-11-10
$ printf -v date '%(%F)T' -1  # Capture as var $date

printfest beaucoup plus rapide que datepuisque c'est un Bash intégré alors que datec'est une commande externe.

De plus, printf -v date ...est plus rapide que date=$(printf ...)cela car il ne nécessite pas de forger un sous-shell.

wjandrea
la source
4
En 2019, cette commande est incroyablement plus rapide * que datesi vous l'utilisez déjà à partir d'un script bash, car elle n'a pas à charger de bibliothèques supplémentaires. (* J'ai mesuré sur mon serveur linux une différence de vitesse de ~ 160x sur 1000 itérations)
timtj
@timtj Merci de l'avoir signalé! J'ai ajouté quelques notes sur la vitesse à la réponse.
wjandrea
1
J'aimerais pouvoir +5 pour le commentaire de printf -v datene pas bifurquer. Très bonne info !!
timtj
Habituellement, j'utilise la date car j'ai également besoin d'incrémenter certaines dates. Printf peut-il faire de l'arithmétique des dates?
Merlin
1
@Merlin Je ne pense pas
wjandrea
8

Chaque fois que j'ai une tâche comme celle-ci, je retombe

$ man strftime

pour me rappeler toutes les possibilités.

arp
la source
7

si vous voulez l'année dans un format à deux chiffres tel que 17 plutôt que 2017, procédez comme suit:

DATE=`date +%d-%m-%y`
Crt
la source
6
#!/bin/bash -e

x='2018-01-18 10:00:00'
a=$(date -d "$x")
b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"

echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c

Ici, x est un exemple de date utilisée, puis un exemple affiche à la fois le formatage des données et l'obtention de dates 10 minutes de plus que la date actuelle.

ankitbaldua
la source
6

J'utilise la formulation suivante:

TODAY=`date -I`
echo $TODAY

Consultez la page de manuel pour date, il existe un certain nombre d'autres options utiles:

man date
Luís de Sousa
la source
5

J'utilise $(date +"%Y-%m-%d") ou $(date +"%Y-%m-%d %T")avec le temps et les heures.

Miguel
la source
1

Vous pouvez définir la date comme variable d'environnement et plus tard, vous pouvez l'utiliser

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"

ou

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
Farid Haq
la source