ファイルの文字列を日付に変換

ファイルの文字列を日付に変換

ファイルから文字列を読み取り、日付に変換しようとすると何らかの理由で失敗します。実際に現在動作していない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

スクリプト用のようです。FreeBSD

-f input_fmtinput_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。高度な解析を行うには、まずシェルで文字列を前処理するか、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")

おすすめ記事