在Bash中将日期时间字符串转换为历元
日期时间字符串的格式如下:06/12/2012 07:21:22。如何将其转换为UNIX时间戳或纪元?您要查找的是在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
日期--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
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"