Мені потрібно щось просте на кшталт date
, але через секунди з 1970 року замість поточної дати, годин, хвилин і секунд.
date
здається, що не пропонують такий варіант Чи є простий спосіб?
Мені потрібно щось просте на кшталт date
, але через секунди з 1970 року замість поточної дати, годин, хвилин і секунд.
date
здається, що не пропонують такий варіант Чи є простий спосіб?
Відповіді:
Це має працювати:
date +%s
%s seconds since 1970-01-01 00:00:00 UTC
на, %s seconds since the epoch, 1970-01-01 00:00:00 UTC
тому що я пропустив її там.
date
не вбудований bash
, тому ваша версія не bash
має нічого спільного з тим, з якою date
реалізацією постачається ваша система.
date +%s.%N
date +%s%3N
Просто додати.
Отримайте секунди з епохи (1 січня 1970 р.) На будь-яку дату (наприклад, 21 жовтня 1973 р.).
date -d "Oct 21 1973" +%s
Перетворити кількість секунд назад до дати
date --date @120024000
Команда date
досить універсальна. Ще одна класна річ, яку ви можете зробити з побаченням (безсоромно скопійовано з date --help
). Покажіть місцевий час на 9:00 наступної п’ятниці на західному узбережжі США
date --date='TZ="America/Los_Angeles" 09:00 next Fri'
Ще краще, знайдіть час, щоб прочитати чоловічу сторінку http://man7.org/linux/man-pages/man1/date.1.html
date
або тому, що я використовую zsh
(macOS Catalina), але це не працює для мене. Запуск $ date -d "Oct 21 1973" +%s
виходівusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Поки всі відповіді використовують зовнішню програму date
.
Так як Bash 4.2, printf
має новий модифікатор , %(dateformat)T
який, при використанні з аргументом -1
виводить поточну дату з форматом , заданим dateformat
, обробляється strftime(3)
(man 3 strftime
для інформації про формати).
Отже, для чистого рішення Баша:
printf '%(%s)T\n' -1
або якщо вам потрібно зберегти результат у змінній var
:
printf -v var '%(%s)T' -1
Жодних зовнішніх програм і без передплати!
Оскільки Bash 4.3 навіть не можна вказати -1
:
printf -v var '%(%s)T'
(але може бути розумнішим все-таки давати аргументи -1
).
Якщо ви використовуєте -2
як аргумент замість -1
, Bash використовуватиме час запуску оболонки замість поточної дати. Це можна використовувати для обчислення минулих разів
$ 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
-2
якщо у вас є більш тривала робота (придумайте сценарій для керування вашими резервними копіями) і на завершення надішліть пошту "Резервне копіювання розпочато з $ somewhen завершено в $ now" - що можна досягти, -2
уникаючи зберігання виділена змінна на початку.
У більшості реалізацій Awk:
awk 'BEGIN {srand(); print srand()}'
srand()
, як правило, закладається з поточною датою / часом. Другий виклик srand()
повертає значення, яке раніше використовувалося як насіння.
З bash
5.0 ( випущено 7 січня 2019 року ) ви можете використовувати вбудовану зміннуEPOCHSECONDS
.
$ echo $EPOCHSECONDS
1547624774
Є також EPOCHREALTIME
який включає дроби секунд.
$ echo $EPOCHREALTIME
1547624774.371215
EPOCHREALTIME
можна перетворити на мікросекунди (мкс) шляхом видалення десяткової крапки. Це може бути цікавим при використанні bash
вбудованої арифметики(( expression ))
яка може обробляти лише цілі числа.
$ echo ${EPOCHREALTIME/./}
1547624774371215
У всіх прикладах зверху надруковані значення часу рівні для кращої читабельності. Насправді часові значення відрізняються, оскільки кожна команда потребує невеликої кількості часу для виконання.
date +%s%3N
ви можете використовувати)echo $(( ${EPOCHREALTIME/./} / 1000 ))
Це розширення до того, що зробив @pellucide, але для Mac:
Визначити кількість секунд з епохи (1 січня 1970 р.) Для будь-якої дати (наприклад, 21 жовтня 1973 р.)
$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800
Зауважте, що для повноти я додав часову частину до формату. Причина в тому, що date
ви візьмете будь-яку частину дати, яку ви надали, і додасте поточну час до наданого значення. Наприклад, якщо ви виконаєте вищевказану команду о 16:19, без частини '00: 00: 00 ', вона додасть час автоматично. Такий, що "21 жовтня 1973" буде проаналізовано як "21 жовтня 1973 16:19:00". Це може бути не те, що ви хочете.
Щоб конвертувати часову позначку до дати:
$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973
Сторінка користувача Apple для впровадження дати: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
date
команда BSD , тоді як будь-які рішення, що пропонують, date -d
призначені для GNU date
. Дата BSD в macOS походить від FreeBSD і ділиться кількома варіантами з NetBSD та OpenBSD. І це зовсім окремо від баш.
%N
вказана опція дрібних секунд у даті Gnu відсутня дата MacOS. 10.14 жоден з форматів не знаходиться на вкладці "man"; вони знаходяться на strftime(3)
довільній сторінці, яку у вас не буде, якщо у вас не встановлений Xcode, і вони можуть не бачитись з командою man, навіть якщо ви це зробите.