Отримайте поточний час у секундах з епохи на Linux, Bash


633

Мені потрібно щось просте на кшталт date, але через секунди з 1970 року замість поточної дати, годин, хвилин і секунд.

dateздається, що не пропонують такий варіант Чи є простий спосіб?


22
Вибачте, я мушу сказати це .... "" Ця дата, здається, не пропонує такого варіанту. Чи є простий спосіб? '' - прочитайте посібник ще раз ;-)
TheBonsai

7
У деяких версіях на сьогоднішній день є, а в деяких - ні. Тож це не завжди присутнє. Я побіг "type -a date" і використав іншу версію, і це спрацювало.
Скотт Роулі

1
FWIW, Ubuntu має лише / bin / date, на які працює відповідь @ Steef
Джонатан Хартлі

1
@TheBonsai, що не є частиною стандартної версії POSIX інструменту "date". Тільки тому, що у вашій версії є її (ймовірно, GNU), ви не повинні припускати, що всі реалізують.
Wyatt8740

Відповіді:


1159

Це має працювати:

date +%s

45
манжету дати слід змінити з %s seconds since 1970-01-01 00:00:00 UTCна, %s seconds since the epoch, 1970-01-01 00:00:00 UTCтому що я пропустив її там.
devin

3
Не працює для мене. man дата не показує% s. У мене повинна бути дуже стара версія bash (3.2.51 (1) для Solaris)?
livefree75

7
@ livefree75 dateне вбудований bash, тому ваша версія не bashмає нічого спільного з тим, з якою dateреалізацією постачається ваша система.
Адріан Фрюхвітрт

11
А якщо ви хочете частки секунди до дев'яти знаків після коми, використовуйте:date +%s.%N
Джонатан Хартлі

19
Для використання в мілісекундахdate +%s%3N
Хуан Кампа

133

Просто додати.

Отримайте секунди з епохи (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


Це не питання ОП, але воно відповідає моєму, тому +1 від мене.
AnthonyD973

Можливо, це версія 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]
Джошуа Пінтер

43

Поки всі відповіді використовують зовнішню програму 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

9
Ви хочете використовувати, -2якщо у вас є більш тривала робота (придумайте сценарій для керування вашими резервними копіями) і на завершення надішліть пошту "Резервне копіювання розпочато з $ somewhen завершено в $ now" - що можна досягти, -2уникаючи зберігання виділена змінна на початку.
Себастьян Дж.

23

У більшості реалізацій Awk:

awk 'BEGIN {srand(); print srand()}'

21
Нічого незрозумілого
ericslaw

8
Нічого собі, довелося шукати цього. Це прагматичне рішення, але не обов'язково добре / переносне. Здається, що реалізація awksrand() , як правило, закладається з поточною датою / часом. Другий виклик srand()повертає значення, яке раніше використовувалося як насіння.
Ryan Ransford

23

Чистий розчин баші

З 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 ))
luckman212

19

Це розширення до того, що зробив @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


1
Щоб було зрозуміло, це dateкоманда BSD , тоді як будь-які рішення, що пропонують, date -dпризначені для GNU date. Дата BSD в macOS походить від FreeBSD і ділиться кількома варіантами з NetBSD та OpenBSD. І це зовсім окремо від баш.
ghoti

%Nвказана опція дрібних секунд у даті Gnu відсутня дата MacOS. 10.14 жоден з форматів не знаходиться на вкладці "man"; вони знаходяться на strftime(3)довільній сторінці, яку у вас не буде, якщо у вас не встановлений Xcode, і вони можуть не бачитись з командою man, навіть якщо ви це зробите.
Dan Pritts

1

використовувати цей скрипт bash (мій ~/bin/epoch):

#!/bin/bash

# get seconds since epoch
test "x$1" == x && date +%s && exit 0

# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.