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

日期时间字符串的格式如下: 06/12/201207:21:22。如何将其转换为 UNIX 时间戳或时代?

219761 次浏览

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

Consult the appropriate manual page for other versions of date.

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

For Linux, run this command:

date -d '06/12/2012 07:21:22' +"%s"

对于 macOS,运行以下命令:

date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"
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
}

在 bash 中将 日期时间字符串日期时间字符串转换为 新纪元的有效方法

避免 无用的重复分叉,为了使这个翻译成为 快多了..。

我们可以运行 date -f - +%s作为后台进程,而不是为每个转换运行1个 fork..。

介绍

常用语法:

epochDate=$(date -d "$InputDate" +%s)

工作很好,但如果反复运行就会变得很重!

在这篇文章中,你会发现

  • 一个 快速演示接下来,
  • some 解释,
  • 一个 功能可用于许多 Un*x工具(bcrot13sed...)。

快速演示

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,用 "2019-25-12 20:10:00"代替 "now"等等。

一旦 date subprocess的要求结束,你也可以选择:

exec 5>&- ; exec 6<&-

原文(详细说明)

Instead of running 1 叉子 by date to convert, run date just 1 time and do all convertion with same process (this could become a lot quicker)!:

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

功能connecting MySQL/MariaDBPostgreSQLSQLite..。

You may find them in different version on GitHub, or on my site: 下载 or show.

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;}

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

只要确定你想使用什么时区。

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"