转换日期时间字符串中的Bash纪元转换日期时间字符串中的Bash纪元(Convert date ti

2019-05-17 16:21发布

日期时间字符串的格式如下:2012年6月12日7时21分22秒。 我怎样才能将其转换为UNIX时间戳或时代?

Answer 1:

什么你要找的是date --date='06/12/2012 07:21:22' +"%s" 。 请记住,这是假定你使用GNU的coreutils,既--date%s格式字符串是GNU扩展。 POSIX没有指明那些,所以即使是在POSIX兼容的系统使这种转换没有可移植的方法。

对于其他版本请查阅相应的手册页date

注:庆典--date-d选项预计美国的日期或ISO8601格式,即mm/dd/yyyyyyyy-mm-dd ,而不是在英国,欧盟或任何其他形式。



Answer 2:

对于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"


Answer 3:

很多这些答案过于复杂,也缺少如何使用变量。 这是你会怎么做更简单标准的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"

结果是 :

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
}


Answer 4:

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
}


Answer 5:

转换日期时间字符串在bash命令UNIX时间戳

正如丹尼尔·卡米尔Kozar回答正确, 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


文章来源: Convert date time string to epoch in Bash
标签: bash shell date