Data w formacie RRRR-MM-DD w skrypcie powłoki

1108

Próbowałem użyć $(date)w skrypcie powłoki bash, jednak chcę mieć datę w YYYY-MM-DDformacie.
Jak mogę to zdobyć?

Kapsh
źródło

Odpowiedzi:

1826

W bash (> = 4.2) lepiej jest używać wbudowanego formata daty printf (część bash) niż zewnętrznego date(zwykle data GNU).

Takie jak:

# 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

W uderzeniu (<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')

Inne dostępne formaty daty można przeglądać na stronach podręcznika daty (dla zewnętrznego polecenia nieobsługującego bash):

man date
Philip Fourie
źródło
4
W pierwszych dniach miesiąca dostaję komunikat „2012-07-1”, o który nie prosi OP.
DerMike,
6
To działa dla mnie. Strona podręcznika sugeruje, że pierwszy miesiąc to 01, nr 1 (np. 01.07.2012).
Bob Kuhar
30
DATA = $ (data +% d-% m-% Y ""% H:% M:% S); Po czym skończyłem.
JacopKane
5
Nie sprawdziłem, jak szeroko dostępne są te skróty, ale w niektórych dystrybucjach możesz użyć ich +%F %Tjako skrótu +%Y-%m-%d %H:%M:%S. Zauważ, że niektóre systemy plików (kaszel ** HFS) przekonwertują :plik na a /, dając ci taki ciąg znaków, 2016-09-15 11/05/00który może być mylący.
beporter
24
Preferowana składnia w dowolnej powłoce zgodnej z POSIX w tym tysiącleciu jest date=$(date)zamiast date=`date`. Nie używaj także wielkich liter do zmiennych prywatnych; nazwy zmiennych pisane wielkimi literami są zarezerwowane dla systemu.
tripleee
335

Próbować: $(date +%F)

kwatford
źródło
12
Strony podręcznika dla daty brzmią:% F pełna data; tak samo jak% Y-% m-% d, więc jest to po prostu bardziej zwarta notacja dla przyjętej odpowiedzi.
Håvard Geithus
92

Możesz zrobić coś takiego:

$ date +'%Y-%m-%d'
Cofnij
źródło
47

Szukasz standardowego formatu daty ISO 8601 , więc jeśli masz datę GNU (lub dowolne polecenie daty bardziej nowoczesne niż 1988), po prostu wykonaj:$(date -I)

Mediewista
źródło
9
Mam najnowszy (> 1988) komputer z systemem Mac OS X i date -Inie działałem. Po zainstalowaniu GNU coreutils za pomocą brew (który używa przedrostka „g”) gdate -Idziałało.
Joel Purra
3
Dziwny. Nie mogę znaleźć -Iopcji udokumentowanej dla GNU date, chociaż na pewno wydaje się, że jest równoważna date +%F.
chepner
3
OS X jest ogólnie pustkowiem GPL v3, więc mogą nie mieć ostatnio aktualizacji daty lub BASH.
Indolering
20
date -d '1 hour ago' '+%Y-%m-%d'

Wynik byłby 2015-06-14.

xu2mao
źródło
3
Nieprawidłowy z kilku powodów, oczywiście podaje to niewłaściwą datę między 00:00 a 01:00, a poza tym kończysz na %.
Gerhard Burger,
to nie prawda. powinien być jak ten rzadki pojedynczy cytat
Beyhan Gül
20
$(date +%F_%H-%M-%S)

może służyć do usuwania dwukropków (:) pomiędzy

wynik

2018-06-20_09-55-58
Ahmettolga
źródło
19

W najnowszej wersji Bash (wersja ≥ 4.2) możesz używać wbudowanego printfmodyfikatora formatu %(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

printfjest znacznie szybszy niż dateponieważ jest wbudowanym Bash, podczas gdy datejest poleceniem zewnętrznym.

Co więcej, printf -v date ...jest szybszy niż, date=$(printf ...)ponieważ nie wymaga rozwidlania podpowłoki.

wjandrea
źródło
4
Uwaga: w 2019 r. To polecenie jest niewiarygodnie szybsze * niż datejeśli używasz go już ze skryptu bash, ponieważ nie musi on ładować żadnych dodatkowych bibliotek. (* Zmierzyłem na moim serwerze linuksowym ~ 160x różnica prędkości ponad 1000 iteracji)
timtj
@timtj Dziękujemy za zwrócenie na to uwagi! Do odpowiedzi dodałem kilka uwag na temat prędkości.
wjandrea
1
Chciałbym móc dać +5 za komentarz o printf -v datenie rozwidlaniu podpowłoki. Bardzo dobra informacja !!
timtj
Zwykle używam daty, ponieważ muszę także zwiększać niektóre daty. Czy printf może dokonywać arytmetyki dat?
Merlin
1
@Merlin Nie sądzę
wjandrea
8

Ilekroć mam takie zadanie, wracam do niego

$ man strftime

przypominać sobie o wszystkich możliwościach.

arp
źródło
7

jeśli chcesz, aby rok był w formacie dwucyfrowym, takim jak 17 zamiast 2017, wykonaj następujące czynności:

DATE=`date +%d-%m-%y`
Crt
źródło
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

Tutaj x jest użytą datą próbną, a następnie przykład wyświetla zarówno formatowanie danych, jak i uzyskiwanie dat o 10 minut więcej niż bieżąca data.

ankitbaldua
źródło
6

Używam następującego sformułowania:

TODAY=`date -I`
echo $TODAY

Sprawdź stronę podręcznika date, ponieważ istnieje wiele innych przydatnych opcji:

man date
Luís de Sousa
źródło
5

Używam $(date +"%Y-%m-%d") lub $(date +"%Y-%m-%d %T")z czasem i godzinami.

Miguel
źródło
1

Możesz ustawić datę jako zmienną środowiskową, a później możesz jej użyć

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

lub

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
Farid Haq
źródło