2017-09-27 9 views
-1

J'ai lu beaucoup de documentation sur ce sujet, mais je n'ai pas trouvé la bonne solution à mon problème.Bash data - comment soustraire 30 minutes

Je voudrais soustraire 30 minutes d'une certaine variable. Je l'ai préparé à peu près comme ceci:

Monday=0120 
date_mon=`date -d $Monday +"%H%M"` 
echo $date_mon 
0120 
new_date_mon=`date -d "$date_mon -30 min" +"%H%M"` 
date: invalid date '0120 -30 min' 

edit: on the Linux is fine: 
0050 

(l'heure doit être sous la forme% H% M).

Je ne sais pas ce que je fais mal.

$ Edit:

Le code ci-dessus est correct. J'ai essayé de l'exécuter par MobaXterm où l'erreur est affichée, mais comme je l'ai fait directement sur Linux cela fonctionne.

+2

La date d'entrée 'Monday' est au format' HH: MM'? c'est-à-dire «01: 20» – Inian

+2

que signifie «0120»? –

+0

Lundi est au format HHMM. J'en ai besoin sans deux points. Je dois déduire de 0120 30 minutes pour obtenir le résultat 0050. – KamilK

Répondre

1

commande suivante Soustraire 30min à lundi prochain 01:20

date -d 'Monday 0120 -30min' +'%F %T' 

autrement en utilisant des opérations arithmétiques

hhmm=0120 
((m_from_start_day=(10#$hhmm)/100*60+(10#$hhmm)%100)) 
((m_from_start_day-=30)) 
((hhmm=m_from_start_day/60*100+m_from_start_day%60)) 
echo $hhmm 

Pour garder les zéros

printf -v hhmm %04d $((m_from_start_day/60*100+m_from_start_day%60)) 
echo $hhmm 

Notez les commandes ont été fixés parce que leader 0 indique que l'entrée est octale (10#$hhmm) doit être utilisée à la place de hhmm

également printf -v hhmm, fonctionne sauf hhmm est déclarée avec -i, (declare +i hhmm pour enlever le drapeau), sinon des zéros à gauche vous permet de convertir octal en décimal.

+0

La première option continue d'afficher la même erreur, mais la seconde est correcte, mais peut-être savez-vous comment garder deux zéros avant 50? J'ai besoin de la valeur 0050. – KamilK