Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Bash script e comparazione date

341 views
Skip to first unread message

Journey

unread,
Jul 15, 2012, 6:28:14 PM7/15/12
to
Qualcuno saprebbe dirmi se e come posso verificare se sono
"all'interno" di un intervallo di ore?
Esempio, tra le 23:00 e le 07:00 dormo, altrimenti sono sveglio.

--
J.


zava

unread,
Jul 15, 2012, 6:40:38 PM7/15/12
to
date +%H ?

Journey

unread,
Jul 15, 2012, 7:23:24 PM7/15/12
to
Nel suo scritto precedente, zava ha sostenuto :
mi stampa l'ora (senza i minuti)
conosco il comando, ma forse non del tutto, non ti seguo :-)
posso fare che 01:22 e' maggiore di 23:00? in reala e' minore.
Il problema e' che non so come fare a capire di essere all'interno di
ore notturne.

--
J.


THe_ZiPMaN

unread,
Jul 15, 2012, 7:49:16 PM7/15/12
to
On 07/16/2012 01:23 AM, Journey wrote:
>>> Qualcuno saprebbe dirmi se e come posso verificare se sono
>>> "all'interno" di un
>>> intervallo di ore?
>>> Esempio, tra le 23:00 e le 07:00 dormo, altrimenti sono sveglio.
>>
>> date +%H ?
>
> mi stampa l'ora (senza i minuti)
> conosco il comando, ma forse non del tutto, non ti seguo :-)
> posso fare che 01:22 e' maggiore di 23:00? in reala e' minore.

Chi ti capisce ᅵ bravo...

> Il problema e' che non so come fare a capire di essere all'interno di
> ore notturne.

HOUR=$(date '+%H')
[ $HOUR -ge 7 ] && [ $HOUR -lt 23 ] && echo giorno || echo notte


--
Flavio Visentin

Scientists discovered what's wrong with the female brain: on the left
side, there's nothing right, and on the right side, there's nothing left

mallin.shetland

unread,
Jul 16, 2012, 2:19:17 AM7/16/12
to
Addì lunedì 16 luglio 2012 00:28 Journey scrisse:

> Qualcuno saprebbe dirmi se e come posso verificare se sono
> "all'interno" di un intervallo di ore?
> Esempio, tra le 23:00 e le 07:00 dormo, altrimenti sono sveglio.

1) usare PERL
2) usare la data in formato UNIX e controllare con due semplici if
3) scrivere delle routine per la manipolazione del tempo

mallin.shetland

unread,
Jul 16, 2012, 2:25:16 AM7/16/12
to
Addì lunedì 16 luglio 2012 01:49 THe_ZiPMaN scrisse:

> On 07/16/2012 01:23 AM, Journey wrote:
>> ...
>> posso fare che 01:22 e' maggiore di 23:00? in reala e' minore.
>
> Chi ti capisce è bravo...

Mai sentito parlare dell'aritmetica delì'orologio? Dai, forza,
fai mente locale che non è tanto difficile.




> On 07/16/2012 01:23 AM, Journey wrote:
>>
>> Il problema e' che non so come fare a capire di essere all'interno di
>> ore notturne.

Certo però che anche tu i fai capire benissimo :-)






Addì lunedì 16 luglio 2012 01:49 THe_ZiPMaN scrisse:
>
> HOUR=$(date '+%H')
> [ $HOUR -ge 7 ] && [ $HOUR -lt 23 ] && echo giorno || echo notte

Cavolate. Cerca di capire il problema prima di rispondere.

mallin.shetland

unread,
Jul 16, 2012, 2:39:03 AM7/16/12
to
Addì lunedì 16 luglio 2012 01:49 THe_ZiPMaN scrisse:

> ....

Non ho capito, forse sono ancora addormentato.
Ho cancellato messaggio precedente, mi scuso se si dovesse
essere già propagato.


Max_Adamo

unread,
Jul 18, 2012, 2:40:36 PM7/18/12
to
Il concetto è che se il secondo numero dell'intervallo è più piccolo del
primo... allora vorrà dire che c'è la mezzanotte in mezzo. Chiaro 'sto
fatto?
Allora, dato l'intervallo da ora X a ora Y, se si verifica questa
condizione allora il secondo numero sarà uguale a Y+24

Trasforma questo in un paio di righe di script ed il gioco è fatto.

Per quanto riguarda la notazione dell'ora, poiché il punto è il separatore
dei decimali che puoi usare con "bc -l", dovresti usare: date +%H.%M


Jack

unread,
Jul 18, 2012, 3:46:23 PM7/18/12
to
tratta le 01:22 come se fossero le 25:22 e risolvi :)

Ciao Jack
--
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?

Piergiorgio Sartor

unread,
Jul 18, 2012, 3:53:48 PM7/18/12
to
On 07/16/2012 01:23 AM, Journey wrote:
[...]
> posso fare che 01:22 e' maggiore di 23:00? in reala e' minore.

Ragioniamo un attimo.

Tu scrivi che 01:22 e` minore di 23:00, ma vorresti
che fosse maggiore.
Non sembra molto logico, o no?

> Il problema e' che non so come fare a capire di essere all'interno di
> ore notturne.

Magari usando *due* intervalli?

Uno da, per esempio, 22:00 a 23:59 e l'altro
da 00:00 a 07:00...

In "or" ovviamente...

bye,

--

piergiorgio


Piergiorgio Sartor

unread,
Jul 18, 2012, 4:08:52 PM7/18/12
to
On 07/18/2012 09:53 PM, Piergiorgio Sartor wrote:
[..]
> Magari usando *due* intervalli?
...

Un altro modo, volendo per esempio l'intervallo
22:00-07:00, e farsi dare l'orario attuale piu`
due ore.
Cosi` non resta che controllare l'intervallo
00:00-09:00.

Come fare questo, e` lasciato per esercizio
allo studente :-)

bye,

--

piergiorgio


Max_Adamo

unread,
Jul 18, 2012, 5:30:28 PM7/18/12
to
il problema è che lui non dice cosa vuole fare dopo....
Ipotizziamo che voglia sapere quante ore ci sono dalle 23:00 alle 7:00.
Poiché è posto che l'intervallo del quale lui parla è comunque
"crescente", se il secondo numero è più piccolo vuol dire che c'è
mezzanotte in mezzo (sempre e comunque).

Pertanto:
se [ secondo_numero -lt primo_numero ]; allora
7=7+24
es
E quindi sottrae il primo al secondo: 31 - 23 = 8
mi pare la cosa più sensata... se mette pure i minuti la cosa si incasina
perché può andare in negativo e dovrà togliere un'ora.
Io trasformerei i sessagesimali in decimali, farei quindi la sottrazione e
trasformerei il risultato nuovamente in sessagesimale :)

Piergiorgio Sartor

unread,
Jul 18, 2012, 5:59:24 PM7/18/12
to
On 07/18/2012 11:30 PM, Max_Adamo wrote:
[...]

L'OP scrive di voler sapere quando e` "all'interno
di ore notturne".

Quindi, per esempio, dalle 23:00 alle 05:00.
E` chiaro che non puo` confrontare 01:22 (orario
attuale) con 23:00 allo stesso modo con cui
confronta 01:22 con 05:00...

Quindi deve fare due confronti separati, ovvero
confrontare l'orario attuale + offset, in modo
da tornare in un sistema di riferimento opportuno.

bye,

--

piergiorgio


THe_ZiPMaN

unread,
Jul 18, 2012, 6:08:43 PM7/18/12
to
On 07/18/2012 11:30 PM, Max_Adamo wrote:
> Il Wed, 18 Jul 2012 22:08:52 +0200, Piergiorgio Sartor ha scritto:
>
>> On 07/18/2012 09:53 PM, Piergiorgio Sartor wrote:
>> [..]
>>> Magari usando *due* intervalli?
>> ...
>>
>> Un altro modo, volendo per esempio l'intervallo 22:00-07:00, e farsi
>> dare l'orario attuale piu` due ore.
>> Cosi` non resta che controllare l'intervallo 00:00-09:00.
>>
>> Come fare questo, e` lasciato per esercizio allo studente :-)
>>
>> bye,
>
> il problema ᅵ che lui non dice cosa vuole fare dopo....

Quindi se ci atteniamo solo a quanto da lui asserito mi sembra che la
risposta sia giᅵ stata data.

> Ipotizziamo che voglia sapere quante ore ci sono dalle 23:00 alle 7:00.

E cosa c'entra con il problema?

> Poichᅵ ᅵ posto che l'intervallo del quale lui parla ᅵ comunque
> "crescente", se il secondo numero ᅵ piᅵ piccolo vuol dire che c'ᅵ
> mezzanotte in mezzo (sempre e comunque).

UCCS

> Pertanto:
> se [ secondo_numero -lt primo_numero ]; allora
> 7=7+24
> es
> E quindi sottrae il primo al secondo: 31 - 23 = 8
> mi pare la cosa piᅵ sensata... se mette pure i minuti la cosa si incasina
> perchᅵ puᅵ andare in negativo e dovrᅵ togliere un'ora.
> Io trasformerei i sessagesimali in decimali, farei quindi la sottrazione e
> trasformerei il risultato nuovamente in sessagesimale :)

Quanti giri.... :)

START=23:09:24
END=01:22:23
echo $(((`date -d "tomorrow $END" '+%s'` - \
`date -d "$START" '+%s'`) / 3600 % 24 ))

Journey

unread,
Jul 19, 2012, 7:51:08 AM7/19/12
to
Max_Adamo ha spiegato il 18/07/2012 :
> il problema ᅵ che lui non dice cosa vuole fare dopo....

prima di tutto grazie per le indicazioni e i suggerimenti.
Cosa voglio farci *dopo* e' irrilevante, credo.

> Ipotizziamo che voglia sapere quante ore ci sono dalle 23:00 alle 7:00.
> Poichᅵ ᅵ posto che l'intervallo del quale lui parla ᅵ comunque
> "crescente", se il secondo numero ᅵ piᅵ piccolo vuol dire che c'ᅵ
> mezzanotte in mezzo (sempre e comunque).
>
> Pertanto:
> se [ secondo_numero -lt primo_numero ]; allora
> 7=7+24
> es
> E quindi sottrae il primo al secondo: 31 - 23 = 8
> mi pare la cosa piᅵ sensata... se mette pure i minuti la cosa si incasina
> perchᅵ puᅵ andare in negativo e dovrᅵ togliere un'ora.
> Io trasformerei i sessagesimali in decimali, farei quindi la sottrazione e
> trasformerei il risultato nuovamente in sessagesimale :)

La "richiesta" e' semplice.
Data un'ora di "partenza" xx:yy, un'ora di fine "xx:yy" e l'ora attuale
xx:yy, restituire true che l'ora attuale e' compresa nell'intervallo.

Non posso soffermarmi sulla sola ora, devo considerare anche i minuti.

*Ad esempio*
devi verificare l'ora attuale 01.10 se e' compresa tra le 22.30 e le
07.15
come procedi?

--
J.


Yoda

unread,
Jul 19, 2012, 8:54:53 AM7/19/12
to
Addi' 19 lug 2012, Journey scrive:

> come procedi?

VENTITRE=82800 # cioe' ore 23:00:00
SETTE=25200 # cioe' ore 07:00:00

ORE="$(date "+%H")"
MIN="$(date "+%M")"
SEC="$(date "+%S")"

let ATTUALE="$ORE*3600 + $MIN*60 + $SEC"

E poi: se $ATTUALE < $SETTE oppure > $VENTITRE; then
dormo
else
non faccio un caxxo; fi

(Da guardare e sistemare tutta la sintassi, sto andando a memoria).

--
Tanti saluti

Journey

unread,
Jul 19, 2012, 12:14:46 PM7/19/12
to
Sembra che Yoda abbia detto :
ottimo metodo. grazie :D

--
J.


Piergiorgio Sartor

unread,
Jul 18, 2012, 6:20:34 PM7/18/12
to
On 07/16/2012 01:49 AM, THe_ZiPMaN wrote:
[...]
>> Il problema e' che non so come fare a capire di essere all'interno di
>> ore notturne.
>
> HOUR=$(date '+%H')
> [ $HOUR -ge 7 ] && [ $HOUR -lt 23 ] && echo giorno || echo notte

In effetti, questa e` ancora piu` "smart"!

bye,

--

piergiorgio


Piergiorgio Sartor

unread,
Jul 19, 2012, 1:42:23 PM7/19/12
to
On 07/19/2012 01:51 PM, Journey wrote:
[...]
> devi verificare l'ora attuale 01.10 se e' compresa tra le 22.30 e le 07.15
> come procedi?

Scusa, ma non ti abbiamo gia` abbondantemente risposto?

Per prima cosa, basta scrivere ora e minuti senza alcun
separatore, cioe` 0110 per 01:10, ovvero 2230 per 22:30.

Questi sono sempre e comunque numericamente ordinati.

Poi hai tutte le possibilita` che ti sono state suggerite
precedentemente.

Sei si vuole controllare di essere dentro un intervallo ed
il problema e` il passaggio della mezzanotte si puo`:

1) controllare l'intervallo complementare
2) fare due controlli
3) aggiungere un offset (prima di estrarre l'orario) in modo
tale non cadere a cavallo della mezzanotte

Ovviamente i dettagli dello script sono per il
tuo personale divertimento... :-)

bye,

--

piergiorgio


Journey

unread,
Jul 19, 2012, 1:51:16 PM7/19/12
to
Piergiorgio Sartor ha spiegato il 19/07/2012 :
> On 07/19/2012 01:51 PM, Journey wrote:
> [...]
>> devi verificare l'ora attuale 01.10 se e' compresa tra le 22.30 e le 07.15
>> come procedi?
>
> Scusa, ma non ti abbiamo gia` abbondantemente risposto?

si, grazie di cuore.

--
J.


Max_Adamo

unread,
Jul 20, 2012, 2:31:21 PM7/20/12
to
Il Thu, 19 Jul 2012 00:08:43 +0200, THe_ZiPMaN ha scritto:


> Quanti giri.... :)
>
> START=23:09:24 END=01:22:23 echo $(((`date -d "tomorrow $END" '+%s'` - \
> `date -d "$START" '+%s'`) / 3600 % 24 ))

Tranquillo: abbiamo pisciato *tutti* fuori dal vaso. Ha ragione Malin...
bisogna usare l'ora Unix: date +%s

Max_Adamo

unread,
Jul 20, 2012, 2:32:45 PM7/20/12
to
Il Thu, 19 Jul 2012 13:51:08 +0200, Journey ha scritto:

> *Ad esempio*
> devi verificare l'ora attuale 01.10 se e' compresa tra le 22.30 e le
> 07.15 come procedi?


come già scritto: abbiamo cannato tutti (tranne uno).
Ha ragione malin: date +%s
Tutto il resto non ha senso.

Piergiorgio Sartor

unread,
Jul 20, 2012, 3:34:53 PM7/20/12
to
On 07/20/2012 08:32 PM, Max_Adamo wrote:
> Il Thu, 19 Jul 2012 13:51:08 +0200, Journey ha scritto:
>
>> *Ad esempio*
>> devi verificare l'ora attuale 01.10 se e' compresa tra le 22.30 e le
>> 07.15 come procedi?
>
>
> come già scritto: abbiamo cannato tutti (tranne uno).
> Ha ragione malin: date +%s

Certo, perche` con +%s e` banale trovare se l'ora
e` tra 22:30 e 01:00...

Sei hai fumato qualcosa, facci sapere cosa, perche`
deve essere molto buona... :-)

> Tutto il resto non ha senso.

Tutto il resto che *tu* hai scritto non ha senso...

bye,

--

piergiorgio


THe_ZiPMaN

unread,
Jul 20, 2012, 3:42:29 PM7/20/12
to
Diciamo pure che oltre a pisciar fuori dal vaso non sai nemmeno leggere
quel che quoti.

Max_Adamo

unread,
Jul 20, 2012, 5:20:46 PM7/20/12
to
Il Fri, 20 Jul 2012 21:42:29 +0200, THe_ZiPMaN ha scritto:

> On 07/20/2012 08:31 PM, Max_Adamo wrote:
>> Il Thu, 19 Jul 2012 00:08:43 +0200, THe_ZiPMaN ha scritto:
>>
>>
>>> Quanti giri.... :)
>>>
>>> START=23:09:24 END=01:22:23 echo $(((`date -d "tomorrow $END" '+%s'` -
>>> \
>>> `date -d "$START" '+%s'`) / 3600 % 24 ))
>>
>> Tranquillo: abbiamo pisciato *tutti* fuori dal vaso. Ha ragione
>> Malin...
>> bisogna usare l'ora Unix: date +%s
>
> Diciamo pure che oltre a pisciar fuori dal vaso non sai nemmeno leggere
> quel che quoti.

e mi sa tanto.... cavolo :)
p.s.: comunque tu, invece, non c'era bisogno che mi facevi lo svolgimento
dell'esercizietto :)

gt

unread,
Jul 22, 2012, 9:28:16 AM7/22/12
to
Il 20/07/2012 21:34, Piergiorgio Sartor ha scritto:

> Certo, perche` con +%s e` banale trovare se l'ora
> e` tra 22:30 e 01:00...
>

non mi pare complicato.
più in generale:


START=22:30:00
END=1:18:00

EPOCHNOW=$(date +%s)
EPOCHSTART=$(date --date="$START" +%s)
EPOCHEND=$(date --date="$END" +%s)

if (( $EPOCHEND > $EPOCHSTART )); then BOOL='&&'; else BOOL='||'; fi

if (( $EPOCHEND > $EPOCHNOW $BOOL $EPOCHNOW > $EPOCHSTART ))
then echo "sono dentro"
else echo "sono fuori"
fi

Piergiorgio Sartor

unread,
Jul 22, 2012, 9:53:01 AM7/22/12
to
On 07/22/2012 03:28 PM, gt wrote:
> Il 20/07/2012 21:34, Piergiorgio Sartor ha scritto:
>
>> Certo, perche` con +%s e` banale trovare se l'ora
>> e` tra 22:30 e 01:00...
>>
>
> non mi pare complicato.
> più in generale:

Ma e` molto piu` semplice usare direttamente
l'orario, specialmente come suggerito da Flavio.

bye,

--

piergiorgio


0 new messages