我看不到任何方式指定date
解析格式,和我的输入格式无法识别:如何将字符串转换为特定格式的DateTime?
dt1=`date --date="20151020T113100.475"`; echo $dt1 # fails with 'invalid date'
我看不到任何方式指定date
解析格式,和我的输入格式无法识别:如何将字符串转换为特定格式的DateTime?
dt1=`date --date="20151020T113100.475"`; echo $dt1 # fails with 'invalid date'
至于建议的DevSolar,如果你的arent做任何其他日期处理这些值,可以只需使用
if [[ $dt1 < $dt2 ]]; then
# your logic here..
printf "less than..\n";
else
# your logic here..
printf "greater than or equal..\n";
fi
如果需要转换这些日期的形式和/或想验证字符串输入,可以使用bash子提取:
种$ dt1="20151020T113100.475"
$ date -d "${dt1:0:4}-${dt1:4:2}-${dt1:6:2} ${dt1:9:2}:${dt1:11:2}:${dt1:13:6}"
Tue Oct 20 11:31:00 AEDT 2015
输出格式也可以在这里被应用于例如:
$ date -d "${dt1:0:4}-${dt1:4:2}-${dt1:6:2} ${dt1:9:2}:${dt1:11:2}:${dt1:13:6}" +"%s"
1445301060
此处%s给出秒因为1970-01-01 00:00:00 UTC
所以与另一个日期进行比较(dt2
),可以使用类似于
dt1="20151020T113100.475"
dt2="20151021T113100.475"
ts1=$(date -d "${dt1:0:4}-${dt1:4:2}-${dt1:6:2} ${dt1:9:2}:${dt1:11:2}:${dt1:13:6}" +"%s")
ts2=$(date -d "${dt2:0:4}-${dt2:4:2}-${dt2:6:2} ${dt2:9:2}:${dt2:11:2}:${dt2:13:6}" +"%s")
if ((ts1<ts2)); then
# your logic here..
printf "less than..\n"
else
# your logic here..
printf "greater than or equal..\n"
fi
其输出
less than..
看到man date的有效输出格式
正如你可以看到,有许多不同的方法来解决这个问题。正确指出,关键是找到一种格式,date -d "string"
考虑一个有效的日期/时间字符串。与原来的字符串开始:
20151020T113100.475
一位接近格式的日期将接受的是:
20151020 11:31:00.475
获取当前字符串转换成新的格式,只是需要子去除一些重复和拼凑到一起再次。一个简短的脚本,将工作是:
#!/bin/bash
d="20151020T113100.475"
dt=${d%T*} ## 20151020
tm=${d#*T} ## 113100.475
tfrac=${tm#*.} ## 475
tm=${tm%.$tfrac} ## 113100
## add : between time components
for ((i = 0; i < ${#tm}; i+=2)); do
nt=$nt:${tm:$i:2}
done
nt=${nt:1} ## 11:31:00
nt=${nt}.$tfrac ## 11:31:00.475
echo "date : '$(date -d "$dt $nt" +"%x %X (+.%N nanosecs)")'"
exit 0
输出
$ bash parsedtstamp4.sh
date : '10/20/2015 11:31:00 AM (+.475000000 nanosec)'
你是什么意思?你想给一个格式的日期,并以另一种格式? –
“日期”理解格式或不理解格式。根据您的系统,功能会有所不同。如果你想要更多的控制,你需要使用更强大的东西,比如Perl的内置'Time :: Piece'模块,它允许你指定一个格式字符串。 –
是的。我有2个日期时间,格式为%Y%d%dT%H%M%S.%N。我想比较他们 – ManInMoon