Câu trả lời:
Trong bash (> = 4.2), tốt hơn là sử dụng trình định dạng ngày dựng sẵn của printf (một phần của bash) thay vì bên ngoài date
(thường là ngày GNU).
Như vậy:
# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1
# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1
# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal
Trong bash (<4.2):
# put current date as yyyy-mm-dd in $date
date=$(date '+%Y-%m-%d')
# put current date as yyyy-mm-dd HH:MM:SS in $date
date=$(date '+%Y-%m-%d %H:%M:%S')
# print current date directly
echo $(date '+%Y-%m-%d')
Các định dạng ngày khả dụng khác có thể được xem từ các trang ngày tháng (đối với lệnh cụ thể không bash bên ngoài):
man date
+%F %T
làm lối tắt cho +%Y-%m-%d %H:%M:%S
. Chỉ cần lưu ý rằng một số hệ thống tập tin (ho ** HFS) sẽ chuyển đổi :
thành a /
, cung cấp cho bạn một chuỗi giống như 2016-09-15 11/05/00
rất khó hiểu.
date=$(date)
thay vì date=`date`
. Ngoài ra, không sử dụng chữ hoa cho các biến riêng tư của bạn; tên biến chữ hoa được dành riêng cho hệ thống.
Thử: $(date +%F)
Bạn đang tìm định dạng ngày chuẩn ISO 8601 , vì vậy nếu bạn có ngày GNU (hoặc bất kỳ lệnh ngày nào hiện đại hơn 1988), chỉ cần làm:$(date -I)
date -I
không hoạt động. Đã cài đặt GNU coreutils bằng brew (sử dụng tiền tố 'g') gdate -I
đã hoạt động.
-I
tùy chọn được ghi lại cho GNU date
, mặc dù chắc chắn rằng nó dường như tương đương với date +%F
.
date -d '1 hour ago' '+%Y-%m-%d'
Đầu ra sẽ là 2015-06-14
.
%
.
$(date +%F_%H-%M-%S)
có thể được sử dụng để loại bỏ dấu hai chấm (:) ở giữa
đầu ra
2018-06-20_09-55-58
Với Bash gần đây (phiên bản ≥ 4.2), bạn có thể sử dụng nội dung dựng sẵn printf
với công cụ sửa đổi định dạng %(strftime_format)T
:
$ printf '%(%Y-%m-%d)T\n' -1 # Get YYYY-MM-DD (-1 stands for "current time")
2017-11-10
$ printf '%(%F)T\n' -1 # Synonym of the above
2017-11-10
$ printf -v date '%(%F)T' -1 # Capture as var $date
printf
nhanh hơn nhiều so với date
khi nó là Bash dựng sẵn trong khi date
là lệnh bên ngoài.
Đồng thời, printf -v date ...
nó cũng nhanh hơn date=$(printf ...)
vì nó không yêu cầu phải chia nhỏ.
date
bạn đang sử dụng lệnh này từ trong tập lệnh bash, vì nó không phải tải bất kỳ thư viện bổ sung nào. (* Tôi đã đo trên máy chủ linux của mình một sự khác biệt về tốc độ ~
printf -v date
không bỏ qua một subshell. Thông tin rất tốt !!
#!/bin/bash -e
x='2018-01-18 10:00:00'
a=$(date -d "$x")
b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"
echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c
Ở đây x là ngày mẫu được sử dụng và sau đó ví dụ hiển thị cả định dạng dữ liệu cũng như nhận ngày thêm 10 phút sau ngày hiện tại.
Tôi sử dụng công thức sau đây:
TODAY=`date -I`
echo $TODAY
Kiểm tra trang man cho date
, có một số tùy chọn hữu ích khác:
man date