Мені потрібно щось просте на кшталт 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()повертає значення, яке раніше використовувалося як насіння.
З bash5.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, навіть якщо ви це зробите.