Làm cách nào tôi có thể in ngày trước ngày hiện tại ở Bash?
--date
hoặc -d
tùy chọn chỉ có sẵn trong ngày GNU
Làm cách nào tôi có thể in ngày trước ngày hiện tại ở Bash?
--date
hoặc -d
tùy chọn chỉ có sẵn trong ngày GNU
Câu trả lời:
nếu bạn có ngày GNU và tôi hiểu bạn chính xác
$ date +%Y:%m:%d -d "yesterday"
2009:11:09
hoặc là
$ date +%Y:%m:%d -d "1 day ago"
2009:11:09
date -v-1d
trên OSX (trừ), -v+1d
(cộng)
date_days_past () { days_past=${1:-0}; if ! date -v-${days_past}d +%Y%m%d 2>/dev/null; then date --date="-${days_past} day" +%Y%m%d; fi }
Nếu bạn có BSD (OSX), date
bạn có thể làm như thế này:
date -j -v-1d
Wed Dec 14 15:34:14 CET 2011
Hoặc nếu bạn muốn thực hiện tính toán ngày vào một ngày tùy ý:
date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31
date --date='-1 day'
date: illegal option -- -
date
, có sẵn thông qua coreutils
gói, để làm cho cú pháp này hoạt động trên macOS. Nếu bạn đang sử dụng Homebrew, bạn có thể cài đặt nó qua brew install coreutils
, sau đó bạn sẽ có thể sử dụng ngày GNU thông qua gdate
lệnh. Xem: toporms.net/blog/2013/04/14/ từ
MAC OSX
Cho ngày hôm qua:
date -v-1d +%F
trong đó 1ngày xác định ngày hiện tại trừ đi 1 ngày. Tương tự
ngày -v-1w +% F - cho ngày tuần trước
ngày -v-1m +% F - cho ngày tháng trước
NẾU BẠN CÓ NGÀY GNU,
date --date="1 day ago"
Thông tin thêm: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html
Hướng dẫn viết kịch bản Bash nâng cao
date +%Y:%m:%d -d "yesterday"
Để biết chi tiết về định dạng ngày, xem trang hướng dẫn sử dụng
date --date='-1 day'
Xin lỗi không đề cập đến tôi trên hệ thống Solaris. Như vậy, công tắc -date không khả dụng trên bash Solaris.
Tôi phát hiện ra rằng tôi có thể có được ngày trước đó với một mẹo nhỏ trên múi giờ.
DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE
bash $(TZ=America/New_York date +%Y-%m-%d)
Sử dụng Perl thay thế có lẽ?
perl -e 'print scalar localtime( time - 86400 ) . "\n";'
Hoặc, sử dụng nawk và (ab) use / usr / bin / adb:
nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb
Đã qua đây quá ... điên rồ!
/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400}' | adb
date --date='-1 day'
#!/bin/bash
OFFSET=1;
eval `date "+day=%d; month=%m; year=%Y"`
# Subtract offset from day, if it goes below one use 'cal'
# to determine the number of days in the previous month.
day=`expr $day - $OFFSET`
if [ $day -le 0 ] ;then
month=`expr $month - 1`
if [ $month -eq 0 ] ;then
year=`expr $year - 1`
month=12
fi
set `cal $month $year`
xday=${$#}
day=`expr $xday + $day`
fi
echo $year-$month-$day
1 July , 2013
, kết quả được in ra 2013-6-1347
, trong khi kết quả được mong đợi là2013-6-30
echo $(cal $month $year)|tr ' ' '\n'|tail -n 1
"
Bạn có thể thực hiện một phép tính đơn giản, được chỉnh sửa bằng biểu thức chính quy, nếu định dạng ngày được chọn là 'YYYYMM':
echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'
Vào tháng 1 năm 2020, nó sẽ trả về 201912 ;-) Nhưng, đó chỉ là một cách giải quyết, khi ngày không có tùy chọn tính toán và các tùy chọn phiên dịch ngày khác (ví dụ: sử dụng perl) không khả dụng ;-)
date -d "yesterday" '+%Y-%m-%d'
hoặc là
date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
date: illegal option: -d
trên Solaris. Câu trả lời của bạn dựa trên các phần mở rộng GNU không di động với tiện ích tiêu chuẩn POSIXdate
cho câu hỏi về nền tảng không phải GNU Solaris.
Hãy thử đoạn mã dưới đây, phần này cũng đảm nhiệm phần DST.
if [ $(date +%w) -eq $(date -u +%w) ]; then
tz=$(( 10#$gmthour - 10#$localhour ))
else
tz=$(( 24 - 10#$gmthour + 10#$localhour ))
fi
echo $tz
myTime=`TZ=GMT+$tz date +'%Y%m%d'`
Courtsey Ansgar Wiechers
Giải pháp nhận thức DST:
Thao tác với múi giờ có thể thay đổi đồng hồ một vài giờ. Do thời gian tiết kiệm ánh sáng ban ngày, 24 giờ trước có thể là hôm nay hoặc ngày hôm kia.
Bạn chắc chắn rằng ngày hôm qua là 20 hoặc 30 giờ trước. Cái nào? Chà, cái gần đây nhất không phải hôm nay.
echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1
Tham số -e được sử dụng trong lệnh echo là cần thiết với bash, nhưng sẽ không hoạt động với ksh. Trong ksh bạn có thể sử dụng cùng một lệnh mà không cần cờ -e.
Khi tập lệnh của bạn sẽ được sử dụng trong các môi trường khác nhau, bạn có thể bắt đầu tập lệnh với #! / Bin / ksh hoặc #! / Bin / bash. Bạn cũng có thể thay thế \ n bằng một dòng mới:
echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9