Извините, я должен сказать это ... »« Дата не предлагает такой вариант. Есть ли простой способ? »- прочитайте руководство снова ;-)
TheBonsai
7
Некоторые версии даты имеют это, а некоторые нет. Так что это не всегда присутствует. Я запустил 'type -a date' и использовал другую версию, и это сработало.
Скотт Роули
1
FWIW, в Ubuntu есть только / bin / date, для которого работает ответ @ Steef
Джонатан Хартли,
1
@TheBonsai, который не является частью стандартной версии инструмента даты POSIX. Просто потому, что она есть в вашей версии (возможно, GNU), вы не должны предполагать, что у всех есть реализация.
Дата manpge должна быть изменена с %s seconds since 1970-01-01 00:00:00 UTCна, %s seconds since the epoch, 1970-01-01 00:00:00 UTCпотому что я пропустил это там.
Девин
3
Не работает для меня свидание не показывает% 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'
Это не вопрос ОП, но он отвечает на мой, поэтому +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для получения информации о форматах).
Итак, для чистого решения Bash:
printf '%(%s)T\n'-1
или если вам нужно сохранить результат в переменной var:
printf -v var '%(%s)T'-1
Никаких внешних программ и никаких оболочек!
Начиная с Bash 4.3, можно даже не указывать -1:
printf -v var '%(%s)T'
(но, тем не менее, было бы разумнее всегда приводить аргумент -1).
Если -2вместо аргумента вы используете аргумент -1Bash, вместо текущей даты будет использоваться время запуска оболочки. Это может быть использовано для вычисления прошедшего времени
$ 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избегая хранения выделенная переменная в начале.
Себастьян Дж.
24
Чистое решение для bash
Начиная с версии bash5.0 ( выпущенной 7 января 2019 года ) вы можете использовать встроенную переменную EPOCHSECONDS.
$ echo $EPOCHSECONDS
1547624774
Также есть EPOCHREALTIMEдоли секунды.
$ echo $EPOCHREALTIME
1547624774.371215
EPOCHREALTIMEможно преобразовать в микросекунды (мкс), удалив десятичную точку. Это может представлять интерес при использовании bashвстроенной арифметики, (( expression ))которая может обрабатывать только целые числа.
$ echo ${EPOCHREALTIME/./}1547624774371215
Во всех приведенных выше примерах значения времени одинаковы для лучшей читаемости. В действительности значения времени будут отличаться, так как выполнение каждой команды занимает небольшое количество времени.
Вау, должен был пойти посмотреть это. Это прагматичное решение, но не обязательно хорошее / переносимое. Кажется, что реализации awksrand() обычно засеиваются с текущей датой / временем. Второй вызов srand()возвращает значение, ранее использовавшееся в качестве начального числа.
Райан Рэнсфорд
19
Это расширение того, что сделал @pellucide, но для Mac:
Определить количество секунд с начала эпохи (1 января 1970 г.) для любой заданной даты (например, 21 октября 1973 г.)
Обратите внимание, что для полноты я добавил временную часть в формат. Причина в том, что dateвы возьмете ту часть даты, которую вы ей дали, и добавите текущее время к предоставленному значению. Например, если вы выполните вышеупомянутую команду в 16:19 без части '00: 00: 00 ', она автоматически добавит время. Так что «21 октября 1973 года» будет проанализировано как «21 октября 1973 года 16:19:00». Это может быть не то, что вы хотите.
Для ясности, это для команды BSD date, в то время как любые решения, предлагаемые date -dдля GNU date. Дата BSD в macOS взята из FreeBSD и имеет несколько вариантов с NetBSD и OpenBSD. И это совершенно отдельно от Баш.
Готи
%Nуказана опция дробных секунд в дате Gnu отсутствует дата MacOS. На 10.14 ни один из форматов отсутствует на странице руководства; они находятся на strftime(3)странице руководства , которой у вас не будет, если у вас не установлен XCode, и они могут не увидеть команду man, даже если вы это сделаете.
Дэн
1
используйте этот скрипт (мой ~/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""$@"
Ответы:
Это должно работать:
источник
%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
довольно разносторонняя. Еще одна крутая вещь, которую вы можете сделать с датой (беззастенчиво скопированаdate --help
). Покажите местное время для 9:00 в следующую пятницу на западном побережье США.А еще лучше уделите некоторое время чтению справочной страницы 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
для получения информации о форматах).Итак, для чистого решения Bash:
или если вам нужно сохранить результат в переменной
var
:Никаких внешних программ и никаких оболочек!
Начиная с Bash 4.3, можно даже не указывать
-1
:(но, тем не менее, было бы разумнее всегда приводить аргумент
-1
).Если
-2
вместо аргумента вы используете аргумент-1
Bash, вместо текущей даты будет использоваться время запуска оболочки. Это может быть использовано для вычисления прошедшего времениисточник
-2
в случае, если у вас есть более продолжительное задание (например, сценарий для управления вашими резервными копиями), и в конце отправьте письмо «Резервное копирование началось с $ somewhen, завершено за $ now» - что можно сделать,-2
избегая хранения выделенная переменная в начале.Чистое решение для bash
Начиная с версии
bash
5.0 ( выпущенной 7 января 2019 года ) вы можете использовать встроенную переменнуюEPOCHSECONDS
.Также есть
EPOCHREALTIME
доли секунды.EPOCHREALTIME
можно преобразовать в микросекунды (мкс), удалив десятичную точку. Это может представлять интерес при использованииbash
встроенной арифметики,(( expression ))
которая может обрабатывать только целые числа.Во всех приведенных выше примерах значения времени одинаковы для лучшей читаемости. В действительности значения времени будут отличаться, так как выполнение каждой команды занимает небольшое количество времени.
источник
date +%s%3N
вы) вы можете использоватьecho $(( ${EPOCHREALTIME/./} / 1000 ))
С большинством реализаций Awk:
источник
srand()
обычно засеиваются с текущей датой / временем. Второй вызовsrand()
возвращает значение, ранее использовавшееся в качестве начального числа.Это расширение того, что сделал @pellucide, но для Mac:
Определить количество секунд с начала эпохи (1 января 1970 г.) для любой заданной даты (например, 21 октября 1973 г.)
Обратите внимание, что для полноты я добавил временную часть в формат. Причина в том, что
date
вы возьмете ту часть даты, которую вы ей дали, и добавите текущее время к предоставленному значению. Например, если вы выполните вышеупомянутую команду в 16:19 без части '00: 00: 00 ', она автоматически добавит время. Так что «21 октября 1973 года» будет проанализировано как «21 октября 1973 года 16:19:00». Это может быть не то, что вы хотите.Чтобы преобразовать вашу метку времени в дату:
Страница руководства Apple по реализации даты: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
источник
date
, в то время как любые решения, предлагаемыеdate -d
для GNUdate
. Дата BSD в macOS взята из FreeBSD и имеет несколько вариантов с NetBSD и OpenBSD. И это совершенно отдельно от Баш.%N
указана опция дробных секунд в дате Gnu отсутствует дата MacOS. На 10.14 ни один из форматов отсутствует на странице руководства; они находятся наstrftime(3)
странице руководства , которой у вас не будет, если у вас не установлен XCode, и они могут не увидеть команду man, даже если вы это сделаете.используйте этот скрипт (мой
~/bin/epoch
):источник