파일의 문자열을 날짜로 변환

파일의 문자열을 날짜로 변환

파일에서 문자열을 읽은 다음 날짜로 변환하려고 하는데 어떤 이유로 실패합니다. 실제로 현재 작동하지 않는 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_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. 고급 구문 분석을 위해서는 먼저 셸에서 문자열을 전처리하거나 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")

관련 정보