2010-09-09 15 views

cevap

13

Bu biraz zordur. Yapabileceğiniz yani tarihi, genel manipülasyonlara yapabilirsiniz:

date --date '-10 min' 

saat-min-saniye belirtme (UTC kullanarak aksi takdirde PM varsaymak gibi görünüyor çünkü):

date --date '11:45:30 UTC -10 min' 

tarih dize bölmek için, Aklıma tek yolu genişletme substring edilir:

:

a=114530 
date --date "${a:0:2}:${a:2:2}:${a:4:2} UTC -10 min" 

Ve sadece SSDDSS geri almak istiyorsanız

+0

Teşekkür çalışmak yok. Yani açıklığa kavuşturmak için ... zaman şimdiki zaman değil ... bu betiğin içine bir parametre olarak beş veya altı basamaklı bir sayı girilir ... bu yaklaşım işe yarar mı? –

+0

@RogerMoore evet, bu yüzden kullanıyorum --date. "Ss: dd: ss UTC" şeklinde yazılmalıdır, çünkü aksi halde yanlış yorumlanamaz, ancak amacınız için işe yaramış gibi görünüyor. Ss: dd: s şeklinde bir zamanda geçtiğinizde ne yapacağınızdan emin değilim, en iyi testi, gece yarısı ve öğle saatlerinde. – wds

1

neden sadece zamanlama zamanını kullanmıyor ve sonra 600'ü kapalı tutmuyor? Eğer bir 5 veya 6 basamaklı sayıyı olduğundan

$ echo "`date +%s` - 600"| bc; date 
1284050588 
Thu Sep 9 11:53:08 CDT 2010 
$ date -d '1970-01-01 UTC 1284050588 seconds' +"%Y-%m-%d %T %z" 
2010-09-09 11:43:08 -0500 
+0

Cevabınız için teşekkür ederiz. Mesele şu anki zamana göre yapmak zorunda değilim. Bu, betik içine beş veya altı haneli bir sayı olarak geçirilecek keyfi bir zamandır. –

+1

Genellikle, kendi stilinizi/özelliklerinizi vurgulamak ve yayınlarken "$" gibi geleneksel bir istemi kullanmak iyi bir fikirdir. (Bu soruları yanıtlamadan önce PS1 = '\ $' 'ayarlıyorum, böylece kopyalayıp yapıştırabilirim.) –

1

, sen dize kullanımı yapmadan önce ped öyle olmak zorunda:

$ t=90100 
$ while [ ${#t} -lt 6 ]; do t=0$t; done 
$ echo $t 
090100 
$ date +%H%M%S --utc -d"today ${t:0:2}:${t:2:2}:${t:4:2} UTC - 10 minutes" 
085100 

Not hem --utc ve UTC emin sistem en yapmaları gerekmektedir Saat dilimi sonuçları etkilemez.

Bash olan matematik (yani $(( ve (() için, ön sıfır sayısı sekizlik olarak yorumlanmalıdır neden olur. Bununla birlikte, verileriniz, neyse, sayı gibi olmaktan ziyade daha çok string benzeri (özel bir formatla). Yukarıda bir süre kullandım çünkü bir sayı gibi davranıyormuş gibi geliyor ve bu yüzden 12:01 için 100 olabilir.

1

Bash sürümüm, -d veya - yukarıda kullanıldığı gibi desteklemiyor. Ancak, doğru 0-yastıklı girişi varsayılarak, bu cevap için

$ input_time=130503 # meaning "1:05:03 PM" 

# next line calculates epoch seconds for today's date at stated time 
$ epoch_seconds=$(date -jf '%H%M%S' $input_time '+%s') 

# the 600 matches the OP's "subtract 10 minutes" spec. Note: Still relative to "today" 
$ calculated_seconds=$((epoch_seconds - 600)) # bc would work here but $((...)) is builtin 

# +%H%M%S formats the result same as input, but you can do what you like here 
$ echo $(date -r $calculated_seconds '+%H%M%S') 

# output is 125503: Note that the hour rolled back as expected.