Ngày định dạng YYYY-MM-DD trong tập lệnh shell


1112

Tôi đã thử sử dụng $(date)trong tập lệnh bash shell của mình, tuy nhiên, tôi muốn ngày ở YYYY-MM-DDđịnh dạng.
Làm thế nào để tôi có được điều này?

Câu trả lời:


1831

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

4
Trong những ngày đầu tiên của tháng, tôi nhận được "2012-07-1", đó không phải là điều mà OP yêu cầu.
DerMike

6
Điều này làm việc cho tôi. Trang Man gợi ý rằng đầu tiên của tháng là 01, không 1 (Ví dụ: 2012-07-01).
Bob Kuhar

31
DATE = $ (ngày +% d-% m-% Y ""% H:% M:% S); Những gì tôi đã kết thúc sau.
JacopKane 14/03/2015

5
Tôi chưa kiểm tra mức độ phổ biến của các phím tắt này, nhưng trong một số bản phân phối, bạn có thể sử dụng +%F %Tlà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/00rất khó hiểu.
beporter

24
Cú pháp ưa thích trong bất kỳ shell tuân thủ POSIX nào trong thiên niên kỷ này là 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.
tripleee

335

Thử: $(date +%F)


12
Các trang man cho ngày đọc:% F ngày đầy đủ; giống như% Y-% m-% d, vì vậy đây chỉ là một ký hiệu nhỏ gọn hơn cho câu trả lời được chấp nhận.
Håvard Geithus

92

Bạn có thể làm một cái gì đó như thế này:

$ date +'%Y-%m-%d'

47

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)


9
Tôi có một máy tính Mac OS X gần đây (> 1988) và date -Ikhông hoạt động. Đã cài đặt GNU coreutils bằng brew (sử dụng tiền tố 'g') gdate -Iđã hoạt động.
Joel Purra

3
Lạ Tôi không thể tìm thấy -Itù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.
chepner

3
OS X nói chung là vùng đất hoang GPL v3, vì vậy họ có thể không cập nhật ngày hoặc BASH gần đây.
Xúi giục

20
date -d '1 hour ago' '+%Y-%m-%d'

Đầu ra sẽ là 2015-06-14.


3
Sai vì một vài lý do, rõ ràng điều này đưa ra ngày sai từ 00:00 đến 01:00, và bên cạnh đó bạn kết thúc bằng a %.
Burger Gerhard

nó không đúng. nên giống như trích dẫn đơn lẻ này
Beyhan Gül

20
$(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

19

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 printfvớ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

printfnhanh hơn nhiều so với datekhi nó là Bash dựng sẵn trong khi datelà 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ỏ.


4
Như một lưu ý trong năm 2019, lệnh này nhanh hơn * so với việc datebạ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 độ ~
160

@timtj Cảm ơn bạn đã chỉ ra điều đó! Tôi đã thêm một số lưu ý về tốc độ cho câu trả lời.
wjandrea

1
Tôi ước tôi có thể +5 cho nhận xét về việc printf -v datekhông bỏ qua một subshell. Thông tin rất tốt !!
timtj

Thông thường tôi sử dụng ngày vì tôi cũng cần tăng qua một số ngày. Printf có thể làm số học ngày?
Merlin

1
@Merlin Tôi không nghĩ vậy
wjandrea

8

Bất cứ khi nào tôi có một nhiệm vụ như thế này, tôi lại rơi vào

$ man strftime

để nhắc nhở bản thân về tất cả các khả năng.


7

Nếu bạn muốn năm ở định dạng hai số như 17 thay vì 2017, hãy làm như sau:

DATE=`date +%d-%m-%y`

6
#!/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.


6

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

5

Tôi sử dụng $(date +"%Y-%m-%d") hoặc $(date +"%Y-%m-%d %T")với thời gian và giờ.


1

Bạn có thể đặt ngày là biến môi trường và sau này bạn có thể sử dụng nó

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"

hoặc là

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
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.