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

在Bash中将日期时间字符串转换为历元,bash,shell,date,Bash,Shell,Date,日期时间字符串的格式如下:06/12/2012 07:21:22。如何将其转换为UNIX时间戳或纪元?您要查找的是日期--date='06/12/2012 07:21:22'+%s'。请记住,这假设您正在使用GNU coreutils,因为--date和%s格式字符串都是GNU扩展。POSIX没有指定这两个选项中的任何一个,因此即使在兼容POSIX的系统上也没有可移植的转换方法 有关日期的其他版本,请参阅相应的手册页 注意:bash--date和-d选项要求日期为US或ISO8601格式,即mm

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

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

有关日期的其他版本,请参阅相应的手册页


注意:bash
--date
-d
选项要求日期为US或ISO8601格式,即
mm/dd/yyyyy
yyyyy-mm-dd
,而不是英国、欧盟或任何其他格式。

对于Linux,请运行此命令

date -d '06/12/2012 07:21:22' +"%s"
date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"
对于mac OSX,请运行此命令

date -d '06/12/2012 07:21:22' +"%s"
date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"
使用
日期
作为后台专用流程的高效解决方案 避免无用的重复分叉,以使此翻译更快

我们可以运行
date-f-+%s
作为后台进程,而不是为每个翻译运行一个fork

简介 在这篇文章中,你会发现

  • 下面是一个快速演示
  • 一些解释,
  • 可用于许多Un*x工具的功能(
    bc
    rot13
    sed
    …)
快速演示 以及:

从超过6秒到不到半秒(在我的主机上)

您可以检查
echo$ans
,将
“now”
替换为
“2019-25-12 20:10:00”
等等

或者,一旦日期子流程的要求结束,您可以:

样本:

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" )
(答案可能是:

这是一次处决

使用长时间运行的子流程 我们只需要一个fifo:

我们可以建立一个小功能:

mydate() {
    local var=$1;
    shift;
    echo >&7 $@
    read -u 8 $var
}

mydate start1 $(LANG=C ps ho lstart 1)
echo $start1
或者使用我的
newConnector
功能 具有连接MySQL/MariaDB、
PostgreSQL
SQLite
的功能

您可以在或我的网站上找到不同的版本:或

Nota:在GitHub上,函数和测试是分开的文件。在我的站点上,如果这个脚本不是源代码,测试只需运行


这些答案中有很多过于复杂,也缺少如何使用变量。在标准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"
date -u -d "$datetime" +"%s" #general output = "1339485682"
但是,如果您有意要传递UTC日期时间,并且需要正确的时区,则需要添加
-u
标志。否则,您需要将其从本地时区转换

date -d "$datetime" +"%s" #depends on local timezone, my output = "1339456882"
date -u -d "$datetime" +"%s" #general output = "1339485682"

当我在Mac OSX 10.8.2上运行像我这样的noobs时,
+%s“
代表输出格式,
%s
是1970年以来的时间格式(以秒为单位)。注意:如果你想在另一个时区(如UTC)中指定时间,请在末尾加上-HHMM或+HHMM。因此
date--date date='06/12/2012 07:21:22-0000'+%s
将UTC日期转换为unix时间戳对于GNU日期,如果您希望使用UTC,请注意格式是
yyy-mm-dd hh:mm:ss
请查看:
gdate--date='2019-06-18 00:02:00+0000'+%s
在Mac上不起作用…我想知道是否有办法同时在Mac和LinuxOn OSX上工作时间戳会随着时间的推移而增加t时间。我目前没有对此的解释……更新:这是因为它调整了本地时间的时间戳,我想……添加一个
-u
标志应该可以解决这个问题。@AbdulRehmanJanjua
-u
标志应该在
-f
标志之前,否则shell会将其解释为格式字符串。因此,它应该是:
日期-J-U-F“%A...”/代码>在MACOS终端中完全粘贴失败。<代码>日期-JF“%Y-%-%%D%H:%M:%s”“2018-01-08 14:45”+%S/<代码>欢迎堆栈溢出。考虑添加您的代码之外的解释。如果我的日期格式是“YYYYMMD”?EX.20200 827,您也可以使用它。<代码>日期<代码>格式正确地输入此输入。
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
# Exit here if script is sourced
[ "$0" = "$BASH_SOURCE" ] || { true;return 0;}
#!/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"
date -u -d "$datetime" +"%s" #general output = "1339485682"