Строка даты и времени имеет следующий формат: 12.06.2012 07:21:22. Как я могу преобразовать его в метку времени или эпоху UNIX?
95
То, что вы ищете date --date='06/12/2012 07:21:22' +"%s"
. Имейте в виду, что здесь предполагается, что вы используете GNU coreutils, поскольку и то, --date
и другое, и %s
строка формата являются расширениями GNU. POSIX не определяет ни то, ни другое, поэтому нет переносимого способа сделать такое преобразование даже в системах, совместимых с POSIX.
Обратитесь к соответствующей странице руководства для других версий date
.
Примечание: bash --date
и -d
option ожидают дату в формате США или ISO8601, т. Е. mm/dd/yyyy
Или yyyy-mm-dd
не в формате Великобритании, ЕС или любом другом формате.
+"%s"
это формат вывода и%s
формат времени в секундах с 1970 годаdate --date='06/12/2012 07:21:22 -0000' +"%s"
дата UTC преобразуется в метку времени unixyyyy-mm-dd hh:mm:ss
на gnu.org/software/coreutils/manual/html_node/… :gdate --date='2019-06-18 00:02:00 +0000' +%s
Для Linux Выполните эту команду
date -d '06/12/2012 07:21:22' +"%s"
Для Mac OSX выполните эту команду
date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"
источник
-u
флага должно исправить это.-u
флаг должен прийти прежде , чем на-f
флаге или иначе толкует оболочки это формат строки. Итак, это должно быть:date -j -u -f "%a..."
date -jf "%Y-%m-%d %H:%M:%S" "2018-01-08 14:45:00" +%s
Многие из этих ответов слишком сложны, а также не имеют возможности использовать переменные. Вот как вы могли бы сделать это проще в стандартной системе Linux (как уже упоминалось ранее, команду date необходимо настроить для пользователей Mac):
Пример сценария:
#!/bin/bash orig="Apr 28 07:50:01" epoch=$(date -d "${orig}" +"%s") epoch_to_date=$(date -d @$epoch +%Y%m%d_%H%M%S) echo "RESULTS:" echo "original = $orig" echo "epoch conv = $epoch" echo "epoch to human readable time stamp = $epoch_to_date"
Результаты в:
Или как функция:
# -- Converts from human to epoch or epoch to human, specifically "Apr 28 07:50:01" human. # typeset now=$(date +"%s") # typeset now_human_date=$(convert_cron_time "human" "$now") function convert_cron_time() { case "${1,,}" in epoch) # human to epoch (eg. "Apr 28 07:50:01" to 1524916201) echo $(date -d "${2}" +"%s") ;; human) # epoch to human (eg. 1524916201 to "Apr 28 07:50:01") echo $(date -d "@${2}" +"%b %d %H:%M:%S") ;; esac }
источник
get_curr_date () { # get unix time DATE=$(date +%s) echo "DATE_CURR : "$DATE } conv_utime_hread () { # convert unix time to human readable format DATE_HREAD=$(date -d @$DATE +%Y%m%d_%H%M%S) echo "DATE_HREAD : "$DATE_HREAD }
источник
Эффективное решение, использующее в
date
качестве фонового выделенного процессаЧтобы сделать такой перевод намного быстрее ...
вступление
В этом посте вы найдете
bc
,rot13
,sed
...).Быстрая демонстрация
fifo=$HOME/.fifoDate-$$ mkfifo $fifo exec 5> >(exec stdbuf -o0 date -f - +%s >$fifo 2>&1) echo now 1>&5 exec 6< $fifo rm $fifo read -t 1 -u 6 now echo $now
Это должно выводить текущий UNIXTIME . Оттуда вы можете сравнить
time for i in {1..5000};do echo >&5 "now" ; read -t 1 -u6 ans;done real 0m0.298s user 0m0.132s sys 0m0.096s
а также:
time for i in {1..5000};do ans=$(date +%s -d "now");done real 0m6.826s user 0m0.256s sys 0m1.364s
От более 6 секунд до менее чем полсекунды !! (на моем хосте).
Вы можете проверить
echo $ans
, заменить"now"
на"2019-25-12 20:10:00"
и так далее ...При желании вы могли бы, когда требование подпроцесса даты закончилось:
exec 5>&- ; exec 6<&-
Исходный пост (подробное объяснение)
Вместо того, чтобы запускать 1 форк по дате для преобразования, запустите
date
только 1 раз и выполните все преобразования одним и тем же процессом (это может стать намного быстрее) !:Образец:
start1=$(LANG=C ps ho lstart 1) start2=$(LANG=C ps ho lstart $$) dirchg=$(LANG=C date -r .) read -p "A date: " userdate { read start1 ; read start2 ; read dirchg ; read userdate ;} < <( date -f - +%s <<<"$start1"$'\n'"$start2"$'\n'"$dirchg"$'\n'"$userdate" )
Тогда посмотрите:
declare -p start1 start2 dirchg userdate
Это было сделано за один раз!
Использование длительного подпроцесса
Нам просто нужен один фифо :
mkfifo /tmp/myDateFifo exec 7> >(exec stdbuf -o0 /bin/date -f - +%s >/tmp/myDateFifo) exec 8</tmp/myDateFifo rm /tmp/myDateFifo
(Примечание: поскольку процесс запущен и все дескрипторы открыты, мы можем безопасно удалить запись файловой системы fifo.)
Тогда сейчас:
LANG=C ps ho lstart 1 $$ >&7 read -u 8 start1 read -u 8 start2 LANG=C date -r . >&7 read -u 8 dirchg read -p "Some date: " userdate echo >&7 $userdate read -u 8 userdate
Мы могли бы построить небольшую функцию:
mydate() { local var=$1; shift; echo >&7 $@ read -u 8 $var } mydate start1 $(LANG=C ps ho lstart 1) echo $start1
Или используйте мою
newConnector
функциюС функциями для подключения
MySQL/MariaDB
,PostgreSQL
иSQLite
...Вы можете найти их в другой версии на GitHub или у меня на сайте: скачать или показать .
wget https://raw.githubusercontent.com/F-Hauri/Connector-bash/master/shell_connector.bash . shell_connector.bash newConnector /bin/date '-f - +%s' @0 0 myDate "2018-1-1 12:00" test echo $test 1514804400
Примечание: на GitHub функции и тест - это отдельные файлы. На моем сайте тесты запускаются просто, если этот скрипт не получен .
# Exit here if script is sourced [ "$0" = "$BASH_SOURCE" ] || { true;return 0;}
источник
Просто убедитесь, какой часовой пояс вы хотите использовать.
datetime="06/12/2012 07:21:22"
Чаще всего используется часовой пояс машины.
date -d "$datetime" +"%s" #depends on local timezone, my output = "1339456882"
Но если вы намеренно хотите передать дату и время в формате UTC, и вам нужен правильный часовой пояс, вам нужно добавить
-u
флаг. В противном случае вы конвертируете его из местного часового пояса.date -u -d "$datetime" +"%s" #general output = "1339485682"
источник
date
правильно форматирует этот ввод.