2010-09-09 126 views

回答

13

這有點棘手。日期可以做一般的操作,例如,你可以這樣做:

date --date '-10 min' 

指定小時,分鐘,秒(使用UTC,否則它似乎假定PM):

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

要拆分您的日期字符串時,只有我能想到的方式擴展串:

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

如果你只想找回HHMMSS:

date +%H%M%S --date "${a:0:2}:${a:2:2}:${a:4:2} UTC -10 min" 
+0

感謝您的答覆。所以澄清......時間不是現在的時間......它是一個作爲參數傳遞給腳本的五位或六位數字......這種方法是否適用於此? – 2010-09-09 17:53:14

+0

@RogerMoore是的,這就是我使用--date的原因。它必須寫成「hh:mm:ss UTC」,因爲否則日期將無法曲解它,但它似乎適用於您的目的。我不確定當你以hh:mm:s的形式傳遞時會發生什麼,你最好在午夜和中午進行測試。 – wds 2010-09-11 11:53:07

1

爲什麼不只是使用紀元時間,然後把600關掉呢?

$ 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

感謝您的回覆。事情是我不需要根據現在的時間來做。這是一個隨意的時間將作爲五位或六位數字傳遞到腳本中。 – 2010-09-09 17:49:43

+1

通常這是一個好主意,去掉你自己的造型/功能,併發布時使用傳統的提示像「$」。 (在回答這些問題之前,我設置了'PS1 ='\ $'',所以我仍然可以複製粘貼。) – 2010-09-16 21:33:59

1

既然你有一個5 6位數,你必須墊它做字符串操作前:

$ 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 

注意兩個--utc和UTC需要確保系統的時區不影響結果。

對於bash中的數學(即$((((),前導零將導致該數字被解釋爲八進制。但是,無論如何,您的數據更像字符串(使用特殊格式)。我在上面使用了一個while循環,因爲它聽起來像是將它當作一個數字處理,因此可能在上午12:01得到100。

1

我的版本的bash不支持上面使用的-d或--date。但是,假設一個正確的0填充輸入,這是行不通的

$ 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.