Конвертировать строку даты и времени в эпоху Bash
Строка даты и времени имеет следующий формат: 12/12/2012 07:21:22. Как я могу преобразовать это в метку времени UNIX или эпоху?
5 ответов
То, что вы ищете, это date --date='06/12/2012 07:21:22' +"%s"
, Имейте в виду, что это предполагает, что вы используете GNU coreutils, так как оба --date
и %s
строка формата является расширением GNU. POSIX не указывает ни того, ни другого, поэтому не существует переносимого способа сделать такое преобразование даже в POSIX-совместимых системах.
Обратитесь к соответствующей странице руководства для других версий date
,
Примечание: Баш --date
а также -d
опция ожидает дату в формате США или ISO8601, т.е. mm/dd/yyyy
или же yyyy-mm-dd
, не в Великобритании, ЕС или любом другом формате.
Для 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"
Многие из этих ответов слишком сложны, а также отсутствуют способы использования переменных. Вот как вы могли бы сделать это проще в стандартной системе Linux (как упоминалось ранее, для пользователей Mac должна быть настроена команда date):
Пример скрипта:
#!/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"
Результаты в:
RESULTS:
original = Apr 28 07:50:01
epoch conv = 1524916201
epoch to human readable time stamp = 20180428_075001
Или как функция:
# -- 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
}
Просто убедитесь, какой часовой пояс вы хотите использовать.
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"
Преобразовать строку даты и времени в метку времени UNIX в команде bash
Как правильно ответил Даниил Камиль Козар, date
это правильный инструмент.
Я просто хочу добавить конкретный способ их использования, в основном, если у вас много конвертируемых дат:
Вместо запуска 1 разветвления по дате, запустите date
только 1 раз и сделайте все преобразования одним и тем же процессом (это может стать намного быстрее)!:
date -f - +%s <<eof
Apr 17 2014
May 21 2012
Mar 8 00:07
Feb 11 00:09
eof
1397685600
1337551200
1520464020
1518304140
Образец:
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
(может ответить что-то вроде:
declare -- start1="1518549549" declare -- start2="1520183716" declare -- dirchg="1520601919" declare -- userdate="1397685600"
Использование долго работающего подпроцесса
Нам просто нужен один fifo:
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
функция
Вы можете найти их в другой версии на 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
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
}