Xác nhận ngày trong shell


14

Tôi muốn xác thực định dạng ngày dưới đây trong shell script

2015-Jul-13

Tôi đang sử dụng date -d "2015-Jul-13" +"%Y-%b-%d"nhưng lỗi của nó là

date: invalid date '2015-Jul-13'

@Pandya: OP rõ ràng về câu hỏi của anh ấy / cô ấy. OP muốn xác thực (kiểm tra ngày đã nhập có hợp lệ hay không) định dạng ngày được đề cập nhưng có nghĩa là ngày đã nhập không hợp lệ.
Do đó,

GNU datekhông nhận ra YYYY-MMM-DD. Bạn có thể sử dụng YYYY-MM-DDhoặc DD MMM YYYYthay thế?
roaima

Tôi khá chắc chắn at, và - tôi nghĩ - touchcũng vậy. Tôi đã viết một funvtion shell xác thực dựa trên touchmột lần ... không, không touch- nó chỉ xử lý các chữ số, nhưng atthực hiện một số phân tích cú pháp khá sâu ...
mikeerv

@Thushi hãy xóa bình luận dư thừa của chúng tôi
Pandya

6
Đọc sai tiêu đề: Xác thực ngày là địa ngục
Adam Davis

Câu trả lời:


12

GNU datekhông hỗ trợ YYYY-MMM-DD. Tuy nhiên, nó hiểu DD-MMM-YYYY. Vì vậy, nếu bạn thực sự phải xử lý ngày của định dạng này, bạn có thể thực hiện với một cái gì đó như thế này, chỉ đơn giản là hoán đổi các đối số xung quanh thành một định dạng datemong đợi:

ymd='2015-Jul-13'

dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }')
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

Đây là một giải pháp tất cả vỏ. Phá vỡ nó, các IFS=-hướng dẫn yêu cầu shell tách một dòng lệnh sắp tới bằng dấu gạch nối -thay vì khoảng trắng. Các set $ymdphân tích cú pháp $ymdbiến như cho một dòng lệnh, nhưng bây giờ phân tách bằng dấu gạch nối, gán giá trị cho các tham số $1, $2 et seq . Đầu echo "$3-$2-$1"ra tầm thường của ba giá trị được chụp theo thứ tự đảo ngược.

ymd='2015-Jul-13'

dmy=$(IFS=-; set $ymd; echo "$3-$2-$1")
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

@mikeerv: Mát mẻ! Nó hoạt động với: ymd=$(IFS=-;set $ymd; echo "$3-$2-$1") Bạn có thể tiết lộ phép thuật đằng sau setmệnh lệnh không?
tham gia

11

Từ trang: -

DATE STRING
       The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800"
       or  "2004-02-29  16:21:42" or even "next Thursday".  A date string may contain items indicating calendar date,
       time of day, time zone, day of week, relative time, relative date, and numbers.  An empty string indicates the
       beginning  of  the  day.   The  date string format is more complex than is easily documented here but is fully
       described in the info documentation.

Nhưng dường như không nhận ra YYYY-MMM-DDđịnh dạng. Vì vậy, bạn có thể sử dụng từ bên dưới hoặc tương tự như:

$ date -d "2015-07-13" +"%Y-%b-%d"
2015-Jul-13
$ date -d "Jul 13 2015" +"%Y-%b-%d"
2015-Jul-13
$ date -d "13 Jul 2015" +"%Y-%b-%d"
2015-Jul-13

HOẶC bạn đã chuyển đổi / định dạng lại trước khi gửi đến date!

Xem thêm Làm thế nào để bạn chỉ định một định dạng cho đầu vào cho đến ngày?


Tôi khuyên bạn nên truy cập: Ngày định dạng đầu vào .

Đây là các quy tắc.

Đối với các tháng số , định dạng ISO 8601 'năm-tháng-ngày' được cho phép, trong đó năm là bất kỳ số dương nào, tháng là một số từ 01 đến 12 và ngày là một số từ 01 đến 31. Phải có số 0 đứng đầu nếu một số nhỏ hơn mười. Nếu năm là 68 hoặc nhỏ hơn, thì 2000 được thêm vào nó; mặt khác, nếu năm nhỏ hơn 100, thì 1900 được thêm vào nó. Cấu trúc 'tháng / ngày / năm', phổ biến ở Hoa Kỳ, được chấp nhận. Cũng 'tháng / ngày', bỏ qua năm.

Các tháng theo nghĩa đen có thể được viết đầy đủ: 'Tháng một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu', 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', ' Tháng 11 'hoặc' tháng 12 '. Tháng theo nghĩa đen có thể được viết tắt thành ba chữ cái đầu tiên của họ, có thể theo sau là một dấu chấm viết tắt. Nó cũng được phép viết 'Tháng chín' thay vì 'Tháng chín'.

Khi tháng được viết theo nghĩa đen , ngày dương lịch có thể được cung cấp theo bất kỳ điều nào sau đây:

 ngày tháng năm
 ngày tháng
 tháng năm
 ngày tháng năm

nhấn mạnh bởi tôi

Ở đây bạn có thể thấy rằng không có định dạng như năm-tháng ! (trong nhiều tháng được viết theo nghĩa đen)


7

Với zshbạn có thể sử dụng strftimenội dung (có sẵn thông qua zsh/datetime) với -r(đảo ngược):

strftime -r định dạng dấu thời gian

trong đó sử dụng định dạng để phân tích dấu thời gian và xuất số giây kể từ epoch:

zmodload zsh/datetime
strftime -r %Y-%b-%d 2015-Jul-13
1436734800

Lỗi này nếu ngày không hợp lệ:

strftime -r %Y-%b-%d 2015-Jul-33
zsh: strftime: 5: định dạng không khớp

Bạn cũng có thể chuyển đổi giây kể từ epoch sang bất kỳ định dạng ngày tiêu chuẩn / tùy chỉnh nào khác, vd

strftime '%A, %B %d, %Y' 1447970400
Thứ Sáu ngày 20 tháng 11 năm 2015
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.