Convertendo uma string de um arquivo em uma data

2

Estou tentando ler uma string de um arquivo e depois convertê-lo em uma data, mas, por algum motivo, está falhando. Eu estou realmente modificando um GeekTool Geeklet que não está funcionando no momento. Ele lê um arquivo localmente e extrai uma data de destino que é usada em um relógio de contagem regressiva. A linha de código que está falhando é:

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

Eu sei que posso codificar o valor no script usando -v, mas quero descobrir por que essa linha não está funcionando. Não consigo encontrar nenhum refs para converter uma string de um arquivo em um objeto de data. Eu também não consigo encontrar refs para -j ou -f flags ...

[editar] Aqui está o script completo:

#!/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

E o arquivo simplesmente contém:     teste: 17/05 / 2011_12: 00

    
por Gromski 09.08.2011 / 12:33

1 resposta

1

Parece que o script foi escrito para FreeBSD .

-f input_fmt: Use input_fmt as the format string to parse the new_date provided rather than using the default [[[[[cc]yy]mm]dd]HH]MM[.ss] format. Parsing is done using strptime(3).
-j: Do not try to set the date. This allows you to use the -f flag in addition to the + option to convert one date format to another.

Estas são extensões fora do padrão do comando padrão date , que só pode formatar o data atual. No Linux (ou Cygwin) ou qualquer outro sistema com data GNU, você pode usar a opção -d se estiver disposto a passar um formato de data diferente:

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

e chame o script como, por exemplo, %código%. Para uma análise mais sofisticada, pré-processe a string no shell primeiro ou chame Perl ou 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")
    
por 10.08.2011 / 01:42

Tags