Дата формату "РРРР-ММ-ДД" у сценарії оболонки


1109

Я спробував використовувати $(date)в моєму скрипті bash shell, проте я хочу дати у YYYY-MM-DDформаті.
Як я можу це отримати?

Відповіді:


1827

У bash (> = 4.2) бажано використовувати вбудований формат форматів printf (частина bash), а не зовнішній date(зазвичай дата GNU).

Як такий:

# 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

У 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')

Інші доступні формати дати можна переглянути на сторінках man data (для зовнішньої команди, яка не є bash):

man date

4
У перші дні місяця я отримую "2012-07-1", а це не те, що просить ОП.
DerMike

6
Це працює для мене. Сторінка чоловіка припускає, що перший місяць - 01, ні 1 (Перш.
Боб Кухар

30
DATE = $ (дата +% d-% m-% Y ""% H:% M:% S); На чому я закінчився після.
JacopKane

5
Я не перевіряв, наскільки широко доступні ці ярлики, але в деяких дистрибутивах ви можете використовувати їх +%F %Tяк ярлик +%Y-%m-%d %H:%M:%S. Зауважте лише, що деякі файлові системи (кашель ** HFS) перетворять :на а /, надаючи вам такий рядок, 2016-09-15 11/05/00який може заплутати.
beporter

24
Кращим синтаксисом у будь-якій сумісній з POSIX оболонці цього тисячоліття є date=$(date)замість date=`date`. Крім того, не використовуйте великі регістри для ваших приватних змінних; великі імена змінних зарезервовані для системи.
tripleee

335

Спробуйте: $(date +%F)


12
Сторінки, призначені для чоловіків для дати, звучать так:% F повна дата; те саме, що% Y-% m-% d, тому це лише більш компактне позначення прийнятої відповіді.
Håvard Geithus


47

Ви шукаєте стандартний формат дати ISO 8601 , тому якщо у вас є дата GNU (або будь-яка команда дати, більш сучасна, ніж 1988 рік), просто виконайте:$(date -I)


9
У мене недавній (> 1988 р.) Комп'ютер Mac OS X, і date -Iвін не працював. Встановивши GNU coreutils за допомогою brew (який використовує префікс 'g') gdate -I, спрацювало.
Джоел Пурра

3
Незвичайно. Я не можу знайти -Iваріант, задокументований для GNU date, хоча досить впевнений, він здається еквівалентним date +%F.
чепнер

3
OS X, як правило, пустка GPL v3, тому вони, можливо, нещодавно не мають оновленої дати або BASH.
Індолінг

20
date -d '1 hour ago' '+%Y-%m-%d'

Вихід буде 2015-06-14.


3
Неправильно з кількох причин, очевидно, це дає неправильну дату між 00:00 та 01:00, і до того ж ви закінчуєте а %.
Герхард Бургер

це неправда. має бути подібним до цієї рідкої цитати
Beyhan Gül

20
$(date +%F_%H-%M-%S)

можна використовувати для видалення колонок (:) між ними

вихід

2018-06-20_09-55-58

19

З останнім Bash (версія ≥ 4.2) ви можете використовувати вбудований модуль printfмодифікатора формату %(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

printfнабагато швидше, ніж dateоскільки це Bash вбудований в той час dateяк зовнішня команда.

Крім того, printf -v date ...це швидше, date=$(printf ...)оскільки не вимагає розблокування передплатки.


4
Як зауважимо, у 2019 році ця команда неймовірно швидша *, ніж dateякщо ви вже використовуєте це в рамках bash-скрипту, оскільки не потрібно завантажувати зайвих бібліотек. (* Я виміряв на моєму Linux-сервері різницю швидкості ~ 160x за 1000 ітерацій)
timtj

@timtj Дякую за вказівку на це! У відповідь я додав кілька записок про швидкість.
wjandrea

1
Мені хотілося б, щоб я міг поставити +1 за коментар про те, що printf -v dateне надсилати передплату. Дуже хороша інформація !!
timtj

Зазвичай я використовую дату, тому що мені також потрібно збільшити певні дати. Чи можна надрукувати арифметику дати?
Мерлін

1
@Merlin Я не думаю, що так
wjandrea

8

Кожен раз, коли у мене є таке завдання, я в кінцевому підсумку відпадаю

$ man strftime

щоб нагадати собі про всі можливості.


7

якщо ви хочете, щоб рік був у форматі двох чисел, наприклад, 17, а не 2017, зробіть наступне:

DATE=`date +%d-%m-%y`

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

Тут x використовується зразкова дата і тоді приклад відображає як форматування даних, так і отримання дат на 10 хвилин більше, ніж поточна дата.


6

Я використовую наступну рецептуру:

TODAY=`date -I`
echo $TODAY

Ознайомтесь із довідковою сторінкою date, існує ряд інших корисних варіантів:

man date

5

Я використовую $(date +"%Y-%m-%d") або $(date +"%Y-%m-%d %T")з часом і годинами.


1

Ви можете встановити дату як змінну середовища, а пізніше ви можете використовувати її

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

або

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.