如何将字符串转换为具有特定格式的DateTime?

时间:2015-10-20 11:58:01

标签: linux bash datetime

我无法找到为date指定解析格式的任何方法,并且无法识别我的输入格式:

dt1=`date --date="20151020T113100.475"`; echo $dt1  # fails with 'invalid date'

2 个答案:

答案 0 :(得分:2)

根据DevSolar的建议,如果你没有使用这些值进行任何其他日期处理,可以使用

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 了解有效的输出格式

答案 1 :(得分:0)

正如您所看到的,有许多不同的方法可以解决这个问题。正确地指出,关键是找到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)'