Конвертировать строку даты и времени в эпоху Bash

Строка даты и времени имеет следующий формат: 12/12/2012 07:21:22. Как я могу преобразовать это в метку времени UNIX или эпоху?

Ответы на вопрос(5)

Convert date time string to UNIX timestamp in bash command

КакДаниэль Камил Козар правильно ответил,date являетсяthe правильный инструмент.

Я просто хочу добавить определенный способ их использования, в основном, если у вас есть много дат для конвертации:

Вместо запуска 1fork по дате конвертировать, запустить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"

Тогда теперь посмотрим:

declare -p start1 start2 dirchg userdate

(may answer something like:

declare -- start1="1518549549"
declare -- start2="1520183716"
declare -- dirchg="1520601919"
declare -- userdate="1397685600"
Using long running subprocess

Нам просто нужен один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 [email protected]
    read -u 8 $var
}

mydate start1 $(LANG=C ps ho lstart 1)
echo $start1
Or use my newConnector function

Вы можете найти их в другой версии на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
\n'"$start2"

Тогда теперь посмотрим:

declare -p start1 start2 dirchg userdate

(may answer something like:

declare -- start1="1518549549"
declare -- start2="1520183716"
declare -- dirchg="1520601919"
declare -- userdate="1397685600"
Using long running subprocess

Нам просто нужен один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 [email protected]
    read -u 8 $var
}

mydate start1 $(LANG=C ps ho lstart 1)
echo $start1
Or use my newConnector function

Вы можете найти их в другой версии на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
\n'"$dirchg"

Тогда теперь посмотрим:

declare -p start1 start2 dirchg userdate

(may answer something like:

declare -- start1="1518549549"
declare -- start2="1520183716"
declare -- dirchg="1520601919"
declare -- userdate="1397685600"
Using long running subprocess

Нам просто нужен один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 [email protected]
    read -u 8 $var
}

mydate start1 $(LANG=C ps ho lstart 1)
echo $start1
Or use my newConnector function

Вы можете найти их в другой версии на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
\n'"$userdate" )

Тогда теперь посмотрим:

declare -p start1 start2 dirchg userdate

(may answer something like:

declare -- start1="1518549549"
declare -- start2="1520183716"
declare -- dirchg="1520601919"
declare -- userdate="1397685600"
Using long running subprocess

Нам просто нужен один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 [email protected]
    read -u 8 $var
}

mydate start1 $(LANG=C ps ho lstart 1)
echo $start1
Or use my newConnector function

Вы можете найти их в другой версии на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
}
 25 нояб. 2015 г., 14:56

То, что вы ищете, это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, не в Великобритании, ЕС или любом другом формате.

 Edward D.12 июн. 2012 г., 07:35
Большое спасибо. Оно работает!
 16 окт. 2018 г., 02:58
Примечание: если вы хотите указать время в другом часовом поясе (например, в формате UTC), добавьте -HHMM или + HHMM до конца. Такdate --date='06/12/2012 07:21:22 -0000' +"%s" преобразует дату UTC в метку времени Unix
 22 апр. 2013 г., 14:37
.. что работает для меня: дата + & quot;% s & quot;
 18 июн. 2015 г., 05:01
Для нубов, как я+"%s" обозначает выходной формат и%s это формат времени в секундах с 1970 года
 11 февр. 2013 г., 16:22
Я получаю дату: незаконный вариант - когда я работаю на Mac OSX 10.8.2

Многие из этих ответов чрезмерно сложны, а также отсутствуют способы использования переменных. Вот как вы могли бы сделать это проще в стандартной системе 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
}

Для 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"
 28 авг. 2017 г., 19:13
Вставить точно, что в терминале MacOS не удается.
 23 сент. 2015 г., 00:20
В OSX отметка времени увеличивается как-то с текущим временем. В настоящее время у меня нет объяснения этому ...
 01 янв. 2016 г., 16:24
@ Alhadis обновил спасибо
 25 сент. 2015 г., 16:53
Polym я обновил ответ
 24 сент. 2015 г., 12:57
Обновление: это было, потому что это настраивает временную метку для моего местного времени, я думаю ... Добавление-u флаг должен это исправить.

Ваш ответ на вопрос