Chỉ cần sử dụng date
và tin tưởng giây:
Như bạn chỉ ra một cách đúng đắn, rất nhiều chi tiết về tính toán cơ bản bị ẩn nếu bạn dựa vào số học thời gian tiếng Anh. Ví dụ -d yesterday
, và -d 1 day ago
sẽ có hành vi khác nhau.
Thay vào đó, bạn có thể tin cậy tùy thuộc vào giây (được ghi lại chính xác) kể từ UTC epix unix và bash số học để có được khoảnh khắc bạn muốn:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
Điều này đã được chỉ ra trong một câu trả lời khác . Biểu mẫu này dễ di chuyển hơn trên các nền tảng với các date
cờ dòng lệnh khác nhau , không phụ thuộc vào ngôn ngữ (ví dụ: "ngày hôm qua" so với "hier" trong ngôn ngữ Pháp) và thẳng thắn (về lâu dài) sẽ dễ nhớ hơn, bởi vì, tốt, bạn biết rồi Bạn có thể tiếp tục tự hỏi: "Là nó -d 2 hours ago
hay -d 2 hour ago
một lần nữa?" hoặc "Là nó -d yesterday
hay -d 1 day ago
tôi muốn?"). Một chút khó khăn duy nhất ở đây là @
.
Được trang bị bash và không có gì khác:
Bash chỉ trên bash, bạn cũng có thể có được thời gian của ngày hôm qua, thông qua bản dựng sẵn printf:
%(datefmt)T
causes printf to output the date-time string resulting from using
datefmt as a format string for strftime(3). The corresponding argu‐
ment is an integer representing the number of seconds since the
epoch. Two special argument values may be used: -1 represents the
current time, and -2 represents the time the shell was invoked.
If no argument is specified, conversion behaves as if -1 had
been given.
This is an exception to the usual printf behavior.
Vì thế,
# inner printf gets you the current unix time in seconds
# outer printf spits it out according to the format
printf "%(%Y-%m-%d)T\n" $(( $(printf "%(%s)T" -1) - 24*3600 ))
hoặc, tương đương với một biến tạm thời (tùy chọn bên ngoài lớp vỏ bên ngoài, nhưng giữ cho các vars môi trường sạch sẽ).
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
Lưu ý: mặc dù trang man nói rằng không có đối số nào cho trình %()T
định dạng sẽ mặc định -1
, tôi dường như nhận được 0 thay vào đó (cảm ơn bạn, bash phiên bản thủ công 4.3.48)