在Bash中将日期时间字符串转换为纪元

时间:2012-06-12 05:28:03

标签: bash shell date

日期时间字符串采用以下格式:06/12/2012 07:21:22。如何将其转换为UNIX时间戳或纪元?

6 个答案:

答案 0 :(得分:69)

您正在寻找的是date --date='06/12/2012 07:21:22' +"%s"。请记住,这假设您使用的是GNU coreutils,因为--date%s格式字符串都是GNU扩展。 POSIX没有指定其中任何一个,因此即使在符合POSIX的系统上也没有可移植的方式进行这种转换。

请参阅date的其他版本的相应手册页。

注意:bash --date-d选项需要使用美国或ISO8601格式的日期,即mm/dd/yyyyyyyy-mm-dd,而不是英国,欧盟或任何其他格式

答案 1 :(得分:32)

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

答案 2 :(得分:4)

只需确定要使用的时区即可。

 <table>
<tbody>
            <tr >
          <% jour.rows.forEach(function(users4,i,j){%>

                    <tr >
                        <td>
                            <% if (<%=users4.last_name %>  == 'Genush') { %>
                                <%=users4.last_name %> 
                             <% } else { %>
                             <p>something wrong</p> 
                             <% } %>  
                        </td>
                        <td>
                                <%=users4.name %> 
                        </td>
                        <td>
                                <%=users4.name_fff %> 
                        </td>

                        <%} ) %>


</tr>
            </tr>
        </tbody>
    </table>

最流行的使用需要机器时区。

datetime="06/12/2012 07:21:22"

但是如果您有意要传递UTC日期时间并且想要适当的时区,则需要添加date -d "$datetime" +"%s" #depends on local timezone, my output = "1339456882" 标志。否则,您可以从本地时区进行转换。

-u

答案 3 :(得分:3)

很多这些答案过于复杂,也缺少如何使用变量。这就是你如何在标准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
}

答案 4 :(得分:1)

select from sum(LIST1.Visitor)>List2.MaxVisitor groupby LIST1.Website

答案 5 :(得分:0)

在bash命令

中将日期时间字符串转换为UNIX时间戳

正确Daniel Kamil Kozar后,date 正确的工具。

我只是想添加一种使用它们的特定方式,主要是如果你有的话 许多转换日期:

不是按日期运行1 fork 来转换,只需运行date一次,并使用相同的流程进行所有转换(这可能会更快)!:

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函数

您可以在GitHubmy site上的不同版本中找到它们。

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