Lấy ngày (một ngày trước thời điểm hiện tại) ở Bash


171

Làm cách nào tôi có thể in ngày trước ngày hiện tại ở Bash?


Đã thử ngày nhưng có vẻ như không có công tắc -d trong bash của Solaris 10
conandor

Tôi tìm thấy một giải pháp tuyệt vời khác bằng cách cài đặt ngày gnu (gói coreutil) từ sunfreeware.
conandor

cũng không có công tắc -d trong ngày của AIX
frankster

Các --datehoặc -dtùy chọn chỉ có sẵn trong ngày GNU
Chris FA Johnson

Xem stackoverflow.com/q/15374752/462865 để biết phiên bản an toàn DST của câu hỏi này.
Amir Ali Akbari

Câu trả lời:


262

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

1
Tôi thấy hầu hết là câu trả lời được đề xuất nhưng không tìm thấy công tắc -d vào ngày của Solaris
conandor

3
Đối với việc sử dụng trên Ubuntu với chức năng ngày: $ (ngày +% Y:% m:% d -d "1 ngày trước"), đầu ra là: 2013: 04: 21. Và nếu bạn muốn ngày trước 10 ngày, bạn có thể sử dụng $ (ngày +% Y:% m:% d -d "10 ngày trước") hoặc $ (ngày +% Y:% m:% d -d "10 ngày trước ")
zhihong

Trên OS X, bạn có thể cài đặt coreutils thông qua brew: xem stackoverflow.com/questions/15374752/iêu
kasterma

11
date -v-1dtrên OSX (trừ), -v+1d(cộng)
bss

2
Hàm bash này sẽ hoạt động trên cả Linux và OSX. Về cơ bản, nó thử kiểu GNU Linux trước. Nếu thất bại, nó sẽ thử kiểu OSX. Gọi nó với một đối số về số ngày trong quá khứ bạn muốn ngày. Nếu bạn vượt qua không có đối số, nó giả sử 0 ngày. Mã này là một lớp lót, do đó, cắt và dán sẽ hoạt động - không có kết thúc dòng nào được giả định. 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 }
Noah Spurrier

50

Nếu bạn có BSD (OSX), datebạ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

41
date --date='-1 day'

4
Erros trên macOS Sierra:date: illegal option -- -
kuanb

2
Bạn cần cài đặt phiên bản GNU date, có sẵn thông qua coreutilsgó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 gdatelệnh. Xem: toporms.net/blog/2013/04/14/ từ
sumitsu 16/2/18


7

Vâng, đây là một câu trả lời muộn, nhưng điều này dường như làm việc !!

     YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
     echo $YESTERDAY;


4

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

Phương pháp này không đáng tin cậy 100% (thực tế khoảng 98%) nếu bạn sống ở một nơi sử dụng thời gian tiết kiệm ánh sáng ban ngày.
jlliagre

Không chính xác, bạn có thể sử dụng bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002

3

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


1
yesterday=`date -d "-1 day" %F`

Biến ngày hôm qua ở định dạng YYYY-MM-DD thành biến $yesterday.


1
#!/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 để hiệu chỉnh, phương pháp thú vị, mặc dù nó hơi dài dòng.
Peter Lindqvist

1
Xin chào medoix, tôi không thể tìm thấy ý nghĩa của $ {$ #}. Tôi biết rằng $ # là viết tắt của số lượng đối số cho một tập lệnh / hàm. Nhưng tôi không thể liên quan đến điều này. Xin vui lòng giúp đỡ.
Karthick S

Điều này không làm việc cho ngày thịnh hành thay đổi trong tháng. Ví dụ hôm nay là 1 July , 2013, kết quả được in ra 2013-6-1347, trong khi kết quả được mong đợi là2013-6-30
sai

Thay vì 3 dòng giữa "fi" thử "ngày = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"
Anton Roslov

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 ;-)


1
date -d "yesterday" '+%Y-%m-%d'

hoặc là

date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date

Điều đó dẫn đến kết quả date: illegal option: -dtrê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.
Andrew Henle

0

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


0

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

0

Không gợi cảm lắm nhưng có thể làm được việc:

perl -e 'my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 86400);$year += 1900; $mon+= 1; printf ("YESTERDAY: %04d%02d%02d \n", $year, $mon, $mday)'

Được hình thành từ câu trả lời "martin clayton".


-2
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9

Nếu hôm nay là ngày 1 tháng 1 thì sao?
martin clayton
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.