【问题标题】:Linux Bash - Date FormatLinux Bash - 日期格式
【发布时间】:2013-01-04 07:12:11
【问题描述】:

我的日期格式是 yyyy-mm-dd-hh:mm:ss 如何检查我的输入?

应该是这样的:

#!/bin/bash

read -p "Date (format yy-mm-dd-HH-MM-SS): " input

check=$(date +"%Y-%m-%d-%H:%M:%S")

if [ $input -eq $check ]; do

     echo "Right!"

else
     echo "False!"

fi

但这不会检查日期它将我的输入与实际日期进行比较。

最好的问候 文斯

【问题讨论】:

  • 请指定您需要的格式。
  • 您想以您的格式获取当前日期吗?
  • 我已经编辑了我的帖子。应该很清楚,我想做什么;)
  • 你为什么在check中使用HH:MM:SS而不是在read中?
  • 请注意,日期格式%Y-%m-%d 可以写成%F 格式%H:%M:%S 可以更简单地写成%T。所以date +%F-%T 给出与date +%Y-%m-%d-%H:%M:%S 相同的输出(双引号没用,而格式字符串中没有空格)

标签: linux bash shell date formatting


【解决方案1】:

2016 年 4 月编辑!

进一步了解(更强的方法)

原帖

试试:

#!/bin/bash

read -p "Date (format yyyy-mm-dd): " input
check=$(date +%F)

if [ "$input" == "$check" ]; then
    echo "Right!"
else
    echo "False!"
fi

#!/bin/bash

read -p "Date (format YYYY-MN-DD-HH24:MM:SS): " input
check=$(date +%F-%T)

if [ "$input" == "$check" ]; then
    echo "Right!"
else
    echo "False!"
fi

测试良好:

cat >hesdate.sh     # Copy 1st sample and paste to terminal
chmod +x hesdate.sh
date +%F ; ./hesdate.sh
2013-01-04
Date (format yyyy-mm-dd): 2013-01-04
Right!

cat >hesdate.sh     # Copy 2nd sample and paste to terminal
date -d now\ +10\ sec +%F-%T ; ./hesdate.sh 
2013-01-04-10:17:06                                       # copy this line
Date (format YYYY-MN-DD-HH24:MM:SS): 2013-01-04-10:17:06  # past exactly 10 secs after
Right!

编辑添加

要测试日期,您可以:

[[ $input =~ ^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$ ]]

if [[ $input =~ ^2012-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$ ]];then

和/或

inputSecs=$(date -d "${input%-*} ${input##*-}" +%s)

使用引导方法让您确认格式 输入的可靠性

更强的方法

如果要检查输入,还有更精细的方法:

unset adate
declare -A adate
date=2013-12-04-10:17:06
for field in s:0-59 m:0-59 h-0-23 D-1-31 M-1-12 Y#2000-2100 ;do
   sep=${field:1:1} min=${field:2} field=${field:0:1} max=${min#*-} min=${min%-*}
   crt=${date##*${sep:-#}}
   ((min<=10#$crt&&10#$crt<=max)) && adate[$field]=$crt ||
       echo Error: $crt not between $min and $max in $field field.
   date=${date%$sep*}
 done
declare -p adate

这将转储adate 数组变量:

declare -A adate='([D]="04" [M]="12" [Y]="2013" [h]="10" [m]="17" [s]="06" )'

从那里,您可以重新验证天数

max=$(date -d "${adate[Y]}-${adate[M]}-1 +1 month -1 day" +%d)
((10#${adate[D]}>max)) && echo "Error Day number too high: (${adate[D]}>$max)."

唯一没有测试的就是字段长度如果

date=2012-02-29-10:17:06

会起作用,然后

date=2012-2-29-10:17:06

也可以(日期字段中只有一位数字)。

如果需要,你可以换行:

for field in s:0-59 m:0-59 h-0-23 D-1-31 M-1-12 Y#2000-2100 ;do
sep=${field:1:1} min=${field:2} field=${field:0:1} max=${min#*-} min=${min%-*}
crt=${date##*${sep:-#}}

for field in s:20-59 m:20-59 h-20-23 D-21-31 M-21-12 Y#42000-2100 ;do
sep=${field:1:1} len=${field:2:1} min=${field:3} field=${field:0:1} max=${min#*-} min=${min%-*}
crt=${date##*${sep:-#}}
[ ${#crt} -eq $len ] || echo "Error: Field $field is no $len len: ${#crt}."

注意:年份字段被任意限制在 2000 到 2100 之间,但这很容易理解/更改。

【讨论】:

  • 嗨,技术,没错。但我不想将它与真实日期进行比较。我只想检查我输入的日期格式是否正确。
  • 例如:我输入:2012-12-20-10-00-00 --> 程序给我一个错误信息。当我输入: 2012-12-20-10:00:00 --> 程序给了我一个 OK
  • 看看我的答案!
  • 就是这样,我正在寻找。谢谢! :D 你能解释一下 if 查询到底在做什么吗?
【解决方案2】:

您可以使用内联 AWK 脚本:

#!/bin/bash

read -p "Date (format yy-mm-dd-HH-MM-SS): " input

echo $input | awk -F"[-:]" '{
    if( NF == 6 && $1 >= 0 && $2 >= 1 && $2 <= 12 && $3 >= 1 && $3 <= 31 && $4 >= 1 && $4 <= 24 && $5 >= 1 && $5 <= 60 && $6 >= 1 && $6 <= 60 ){
        print "Ok!\n";
    } else {
        print "False!\n";
    }
}'

【讨论】:

    【解决方案3】:

    像这样更改日期提示:

    read -p "Date (format yyyy-mm-dd): " input
    

    另外,用 4 位数的年份格式化日期,从分钟开始的秒数

    check=$(date +"%Y-%m-%d %H:%M:%S")
    

    【讨论】:

    • 好的,我现在已经编辑好了。但我想用这种格式检查我的日期。我的程序将我的输入与实际日期进行比较..
    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2011-09-24
    • 1970-01-01
    • 2020-07-15
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多