2012-10-31 36 views
30

Tôi đang sử dụng dưới đây để có được trước đây, hiện tại và vào tháng tới dưới Ubuntu 11.04:Sử dụng `date` lệnh để có được trước đây, hiện tại và tiếp theo tháng

LAST_MONTH=`date +'%m' -d 'last month'` 
NEXT_MONTH=`date +'%m' -d 'next month'` 
THIS_MONTH=`date +'%m' -d 'now'` 

Nó hoạt động tốt cho đến ngày hôm nay, ngày cuối cùng của Tháng Mười, 2012 (2012/10/31)

tôi nhận được bên dưới kết quả như bây giờ:

$ date 
Wed Oct 31 15:35:26 PDT 2012 
$ date +'%m' -d 'last month' 
10 
$ date +'%m' -d 'now' 
10 
$ $ date +'%m' -d 'next month' 
12 

tôi cho rằng kết quả đầu ra nên 9, 10, 0.123.tương ứng.

Không hiểu tại sao date kết quả đầu ra hoạt động như thế này. Điều gì sẽ là một cách tốt để có được thống nhất previous, currentnext tháng thay thế?

+0

Bạn không thể lấy tháng cho 'now' và sau đó cộng hoặc trừ 1? –

+0

Cảm ơn. Tôi hiểu công trình này cung cấp cho bạn chăm sóc 'Dec + 1 = Jan' vv Câu hỏi của tôi là lý do tại sao ở trên không hoạt động. – greeness

+0

Bạn có thể hiểu rõ hơn bằng cách in ngày đầy đủ được tính cho "tháng trước" và "tháng tiếp theo". Tôi không có một thiết bị đầu cuối unix ngay bây giờ, nhưng tôi đoán là nó chỉ thêm/trừ 30 ngày đến/từ 'now'. –

Trả lời

70

Vấn đề là date yêu cầu của bạn theo đúng nghĩa đen và cố gắng sử dụng ngày 31 tháng 9 (là ngày 31 tháng 10 trừ một tháng) và sau đó vì điều đó không tồn tại nó sẽ chuyển sang ngày tiếp theo. Tài liệu date (từ info date) có các lời khuyên sau:

Sai số trong đơn vị có thể gây ra sự cố với các mục tương đối. Đối với ví dụ , `2003-07-31 -1 tháng 'có thể đánh giá đến 2003-07-01, vì 2003-06-31 là ngày không hợp lệ. Để xác định tháng trước nhiều hơn đáng tin cậy, bạn có thể yêu cầu tháng trước ngày 15 của tháng hiện tại. Ví dụ:

$ date -R 
Thu, 31 Jul 2003 13:02:39 -0700 
$ date --date='-1 month' +'Last month was %B?' 
Last month was July? 
$ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' 
Last month was June! 
+0

Cảm ơn! Rất hữu ích! – greeness

+1

Nó không di chuyển đến ngày hôm sau, phải mất số ngày trong tháng trước và trừ nó từ DoY, dựa trên những gì tôi đã nhìn thấy. date --date = "03/31/2015 -1 tháng" + 'Ngày:% m-% d-% Y' trả về "Ngày: 03-03-2015". 31/3/2016 trả lại ngày 23/2/2016. Tôi chỉ là một chút bởi điều -1 tháng bản thân mình! Tôi yêu các giải pháp mặc dù. – Iamiuru

+0

Lưu ý: Tôi muốn sử dụng phương pháp này, nhưng tôi đã bị mắc kẹt với ngày BusyBox, một chút ít đầy đủ tính năng và không có số học thời gian tích hợp. Thay đổi hơi vô lý này thay vào đó: 'date -d $ (date +% Y) - $ (($ (date +% m) - 1)) - 15 +% B'. Và có, điều này hoạt động qua nhiều năm: nó khá hạnh phúc để chấp nhận số không (tháng mười hai) và âm (đếm ngược) tháng. – Aesin

0

vấn đề chính xảy ra khi bạn không có thời gian lựa chọn --date sẵn và bạn không có quyền để cài đặt nó, sau đó thử dưới đây -

Previous month 
#cal -3|awk 'NR==1{print toupper(substr($1,1,3))"-"$2}' 
DEC-2016 
Current month 
#cal -3|awk 'NR==1{print toupper(substr($3,1,3))"-"$4}' 
JAN-2017 
Next month 
#cal -3|awk 'NR==1{print toupper(substr($5,1,3))"-"$6}' 
FEB-2017 
4

Nếu bạn tình cờ sử dụng ngày trong môi trường MacOS, hãy thử cách này:

ST1:~ ejf$ date 
Mon Feb 20 21:55:48 CST 2017 
ST1:~ ejf$ date -v-1m +%m 
01 
ST1:~ ejf$ date -v+1m +%m 
03 

Ngoài ra, tôi muốn tính tháng trước và tháng tiếp theo vào ngày đầu tiên của mỗi tháng là cách bạn sẽ không gặp vấn đề gì với các tháng kết thúc vào ngày 30/31 hoặc 28/29 (tháng 2/2 năm nhuận)

Các vấn đề liên quan