将文件中的字符串转换为日期

将文件中的字符串转换为日期

我试图从文件中读取字符串,然后将其转换为日期,但由于某种原因它失败了。我实际上正在修改一个目前不起作用的 GeekTool Geeklet。它在本地读取文件并提取目标日期,然后将其用于倒计时时钟。失败的代码行是:

TARGET=$(date -j -f %D_%T $1 +%s)

我知道我可以使用 -v 对脚本中的值进行硬编码,但我想弄清楚为什么这一行不起作用。我似乎找不到任何将字符串从文件转换为日期对象的参考。我也找不到 -j 或 -f 标志的参考...

[编辑] 这是完整的脚本:

#!/bin/bash
# Homework countdown
# BETA - I will update this when I get more time
function countdown
{
CURRENT=$(date +%s)
TARGET=$(date -j -f %D_%T $1 +%s)
LEFT=$((TARGET-CURRENT))
WEEKS=$((LEFT/604800))
DAYS=$(( (LEFT%604800)/86400))
HOURS=$(( (LEFT%86400)/3600))
MINS=$(( (LEFT%3600)/60))
SECS=$((LEFT%60))

lblWEEKS="Weeks"
lblDAYS="Days"

if [ $DAYS == 1 ]
then
lblDAYS="Day"
fi

if [ $WEEKS == 1 ]
then
lblWEEKS="Week"
fi

if [ $HOURS -lt 10 ]
then
    HOURS=0$HOURS
fi  

if [ $MINS -lt 10 ]
then
    MINS=0$MINS
fi


if [ $SECS -lt 10 ]
then
    SECS=0$SECS
fi

echo $1
echo $TARGET
echo $2 $WEEKS Weeks, $DAYS $lblDAYS $HOURS:$MINS:$SECS
# Optional extra line between timers
echo
}
DATES=( $( cat /Users/Shared/Deadlines.txt ) )
# Even numbered indices are names, odd numbered indices are dates


if [ ${#DATES[@]} == 0 ]
then
echo "No Deadlines!"
return
fi

for (( i = 0 ; i < ${#DATES[@]} ; i+=2 ))
do
countdown ${DATES[i+1]} ${DATES[i]}
done

该文件仅包含:测试:17/05/2011_12:00

答案1

看起来脚本是为自由BSD

-f input_fmt:用作input_fmt格式字符串来解析提供的new_date,而不是使用默认[[[[[cc]yy]mm]dd]HH]MM[.ss]格式。解析是使用strptime(3).
-j:请勿尝试设置日期。-f除了+将一种日期格式转换为另一种日期格式的选项之外,这还允许您使用该标志。

这些是非标准扩展标准date命令,只能格式化当前日期。在 Linux(或 Cygwin)或任何其他具有 GNU 日期的系统下,-d如果您愿意传递不同的日期格式,则可以使用该选项:

TARGET=$(date -d "$1" +%s)

并将脚本称为例如test 2011/05/17 12:00。对于更高级的解析,首先在 shell 中预处理字符串或调用 Perl 或 Python:

TARGET=$(IFS=/_:; set $1; date +%S $(($2*10000000000+$1*100000000+
                                      $4*1000000+$5*10000+$1)))
TARGET=$(perl -l -e '($day,$month,$year,$h,$m) = split(/[^0-9]+/, $ARGV[0]); print mktime(0, $m, $h, $day, $month, $year-1900)' "$1")
TARGET=$(python -c '
    import sys, time;
    print time.strftime("%s", time.strptime(sys.argv[1], "%d/%m/%Y_%H:%M"))
   '            "$1")

相关内容