2010-09-09 32 views

Trả lời

13

Đây là một chút khó khăn. Ngày có thể làm thao tác nói chung, tức là bạn có thể làm:

date --date '-10 min' 

Xác định giờ-phút-giây (sử dụng UTC bởi vì nếu không nó có vẻ giả PM):

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

Để chia chuỗi ngày của bạn, cách duy nhất tôi có thể nghĩ ra được substring mở rộng:

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

Và nếu bạn muốn chỉ nhận lại HHMMSS:

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

Cảm ơn bạn đã trả lời. Vì vậy, để làm rõ ... thời gian không phải là thời điểm hiện tại ... nó là một số năm hoặc sáu chữ số được chuyển vào kịch bản như một tham số ... liệu phương pháp này có hiệu quả cho việc này không? –

+0

@RogerMoore vâng, đó là lý do tôi sử dụng --date. Nó phải được viết là "hh: mm: ss UTC" bởi vì nếu không ngày sẽ không thể diễn giải sai nó, nhưng nó dường như hoạt động cho mục đích của bạn. Tôi không chắc điều gì sẽ xảy ra khi bạn vượt qua trong một thời gian dưới dạng hh: mm: s, bạn thử nghiệm nó tốt nhất, cũng khoảng nửa đêm và giữa trưa. – wds

1

tại sao không chỉ sử dụng thời gian epoch và sau đó lấy 600 tắt của nó?

$ 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

Cảm ơn bạn đã trả lời. Vấn đề là tôi không cần phải làm điều đó dựa trên thời điểm hiện tại. Đó là một thời gian tùy ý sẽ được chuyển vào kịch bản dưới dạng số có năm hoặc sáu chữ số. –

+1

Thông thường, bạn nên tách kiểu/tính năng của riêng mình và sử dụng dấu nhắc thông thường như "$" khi đăng. (Tôi đặt 'PS1 = '\ $'' trước khi trả lời những câu hỏi này để tôi vẫn có thể sao chép-dán.) –

1

Vì bạn có một số 5 hoặc 6 chữ số, bạn phải pad nó trước khi thực hiện chuỗi thao tác:

$ 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 

Lưu ý cả hai --utc và UTC được yêu cầu để đảm bảo hệ thống của múi giờ không ảnh hưởng đến kết quả.

Đối với toán học trong bash (tức là $((((), số 0 đứng đầu sẽ làm cho số được hiểu là bát phân. Tuy nhiên, dữ liệu của bạn giống như chuỗi (với định dạng đặc biệt) hơn so với số giống như vậy. Tôi đã sử dụng một vòng lặp trong khi ở trên bởi vì nó có vẻ như bạn đang xử lý nó như một số và do đó có thể nhận được 100 cho 12:01 sáng.

1

Phiên bản bash của tôi không hỗ trợ -d hoặc --date như được sử dụng ở trên. Tuy nhiên, giả sử một đầu vào 0 đệm đúng cách, điều này không hoạt động

$ 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. 
Các vấn đề liên quan