Lấy ngày của tháng trước trong tập lệnh shell


11

Làm cách nào để có được ngày kết thúc tháng trước, dựa trên ngày xử lý?

Ví dụ:

  • Ngày xử lý = 15jan2015
  • Ngày dự kiến ​​= 31d2014,

  • Ngày xử lý = 10feb2015
  • Ngày dự kiến ​​= 31jan2015

Câu trả lời:


27

Với GNU date:

$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015

Một số shell có tích hợp hỗ trợ cho thao tác ngày:

Với ksh93:

$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015

Với zsh:

$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015

4

rất nhiều cách để làm điều này; đây là cái đơn giản nhất tôi tìm thấy (ở đây giả sử GNU date):

$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015

1
Câu trả lời của @stephane rõ ràng hơn và câu trả lời này sẽ không hoạt động trong một số năm lạ, trong đó những ngày bị bỏ qua / thêm vào giữa tháng. Vâng, điều này đã xảy ra. xem youtube.com/watch?v=-5wpm-gesOY
ctrl-alt-delor 17/8/2015

@richard, cách thức hoạt động của ngày bù GNU (thời gian bù 1 ngày không giống như 24 giờ), tôi nghĩ câu trả lời này và của tôi nên tương đương và chỉ thất bại trong các múi giờ sẽ bỏ qua ngày cuối cùng của một tháng ( thông thường, nếu điều đó đã từng xảy ra có lẽ là ở một số đảo Thái Bình Dương để chuyển sang -12: 00 bù thành 12:00 bù (hoặc -13 đến 11 ...) ...
Stéphane Chazelas 17/8/2015

@Stephane cảm ơn vì đã chỉ ra những vấn đề khác, thời gian thật khó khăn. Lưu ý trong giải pháp của bạn, trong trường hợp giữa tháng bị xóa (điều này đã xảy ra) thì ngày 30 không phải là ngày thứ 30, vì vậy trừ đi 30 sẽ không đưa bạn đến ngày cuối cùng của tháng trước. Tôi không thể hiểu tại sao cái này không hoạt động, nếu có ngày đầu tiên của tháng (không được bảo đảm). Tuy nhiên điều này không có nghĩa là nó sẽ.
ctrl-alt-delor

@ giàu, Xem TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '1 day ago'. Bạn gặp lỗi vì không có 2011-12-30 ở đó. Đó là, bù ngày được thực hiện trên thời gian lịch. 2011-12-31 trừ đi 31 ngày mang lại cho bạn 2011-11-30 vì mất 31 ngày 31. Không mất 31 * 24 * 60 * 60 * 60 giây so với thời gian hiện tại. So sánh với TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'thứ mang lại cho bạn ngày 29, tức là lần này là ngày 24 * 60 * 60 * 60 giây trước.
Stéphane Chazelas

2

Đây là phiên bản hoạt động trên Mac OS, sử dụng datetiện ích BSD :

date -v1d -v-1d +%d%b%Y

Các đối số được áp dụng theo thứ tự. Bạn có thể tưởng tượng rằng một ngày được chuyển từ một đối số sang đối số tiếp theo. Ví dụ:

  • Bắt đầu với ngày hiện tại ( date) -> 2017-03-06
  • Đặt ngày đó thành ngày đầu tiên của tháng ( -v1d) -> 2017-03-01
  • Trừ đi một ngày kể từ đó ( -v-1d)-> 2017 / 02-28
  • Định dạng ngày ( +%d%b%Y) -> 28Feb2017

Bạn có thể đạt được bất kỳ số tháng tiến hoặc lùi bằng cách sử dụng date -v-1m -v1d -v-1d, thay thế -1mbằng số tháng lùi hoặc tiến ( +1mbạn muốn).

Đó là câu trả lời chung chung. Câu hỏi này đặc biệt hỏi về ngày liên quan đến ngày bắt đầu. Tiện ích ngày Mac OS / BSD không cho phép bạn cung cấp dấu thời gian để bắt đầu, nhưng bạn có thể đặt riêng từng phần tử ngày:

date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 31 tháng 4 năm 2014


0

Hãy thử sử dụng mã này

date -d "-$(date +%d) days  month" +%Y-%m-%d

Điều đó cho ngày cuối cùng của tháng này .
Warren Young
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.