Tôi cần một cái gì đó đơn giản như date
, nhưng tính bằng giây kể từ năm 1970 thay vì ngày, giờ, phút và giây hiện tại.
date
dường như không cung cấp tùy chọn đó. Có đường nào dễ đi không?
Tôi cần một cái gì đó đơn giản như date
, nhưng tính bằng giây kể từ năm 1970 thay vì ngày, giờ, phút và giây hiện tại.
date
dường như không cung cấp tùy chọn đó. Có đường nào dễ đi không?
Câu trả lời:
Điều này sẽ làm việc:
date +%s
%s seconds since 1970-01-01 00:00:00 UTC
đến %s seconds since the epoch, 1970-01-01 00:00:00 UTC
vì tôi đã bỏ lỡ nó trong đó.
date
không được tích hợp bash
, vì vậy phiên bản của bạn bash
không liên quan gì đến việc date
triển khai hệ thống của bạn.
date +%s.%N
date +%s%3N
Chỉ cần thêm.
Nhận các giây kể từ kỷ nguyên (ngày 1 tháng 1 năm 1970) cho bất kỳ ngày nào (ví dụ: ngày 21 tháng 10 năm 1973).
date -d "Oct 21 1973" +%s
Chuyển đổi số giây trở lại ngày
date --date @120024000
Lệnh date
này khá linh hoạt. Một điều tuyệt vời khác bạn có thể làm với ngày (được sao chép một cách đáng xấu hổ date --help
). Hiển thị giờ địa phương cho 9 giờ sáng thứ Sáu tuần sau trên bờ biển phía tây Hoa Kỳ
date --date='TZ="America/Los_Angeles" 09:00 next Fri'
Tốt hơn hết, hãy dành chút thời gian để đọc trang man http://man7.org/linux/man-pages/man1/date.1.html
date
hoặc vì tôi đang sử dụng zsh
(macOS Catalina) nhưng điều này không phù hợp với tôi. Chạy $ date -d "Oct 21 1973" +%s
kết quả đầu rausage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Cho đến nay, tất cả các câu trả lời sử dụng chương trình bên ngoài date
.
Kể từ Bash 4.2, printf
có một công cụ sửa đổi mới %(dateformat)T
, khi được sử dụng với đối số sẽ đưa -1
ra ngày hiện tại với định dạng được cung cấp bởi dateformat
, được xử lý bởi strftime(3)
( man 3 strftime
để biết thông tin về các định dạng).
Vì vậy, đối với một giải pháp Bash thuần túy:
printf '%(%s)T\n' -1
hoặc nếu bạn cần lưu trữ kết quả trong một biến var
:
printf -v var '%(%s)T' -1
Không có chương trình bên ngoài và không có subshells!
Kể từ Bash 4.3, thậm chí có thể không chỉ định -1
:
printf -v var '%(%s)T'
(nhưng dù sao cũng có thể khôn ngoan hơn khi luôn đưa ra lập luận -1
).
Nếu bạn sử dụng -2
làm đối số thay vì -1
, Bash sẽ sử dụng thời gian shell được bắt đầu thay vì ngày hiện tại. Điều này có thể được sử dụng để tính thời gian trôi qua
$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422
-2
trong trường hợp bạn có một công việc còn chạy nữa (nghĩ về một kịch bản để kiểm soát bạn sao lưu) và gửi thư cuối cùng "Backup bắt đầu tại $ somewhen hoàn thành tại $ bây giờ" - có thể được thực hiện với -2
tránh để lưu trữ một biến chuyên dụng ở đầu.
Với hầu hết các triển khai Awk:
awk 'BEGIN {srand(); print srand()}'
srand()
thường được gieo vào ngày / giờ hiện tại. Cuộc gọi thứ hai để srand()
trả về giá trị được sử dụng trước đó làm hạt giống.
Kể từ bash
5.0 ( phát hành vào ngày 7 tháng 1 năm 2019 ), bạn có thể sử dụng biến tích hợp EPOCHSECONDS
.
$ echo $EPOCHSECONDS
1547624774
Ngoài ra còn EPOCHREALTIME
có phân số của giây.
$ echo $EPOCHREALTIME
1547624774.371215
EPOCHREALTIME
có thể được chuyển đổi thành micro giây (μs) bằng cách xóa dấu thập phân. Điều này có thể quan tâm khi sử dụng bash
's built-in số học (( expression ))
mà chỉ có thể xử lý số nguyên.
$ echo ${EPOCHREALTIME/./}
1547624774371215
Trong tất cả các ví dụ từ phía trên, các giá trị thời gian được in bằng nhau để dễ đọc hơn. Trong thực tế, giá trị thời gian sẽ khác nhau vì mỗi lệnh mất một lượng nhỏ thời gian để được thực thi.
date +%s%3N
), bạn có thể sử dụngecho $(( ${EPOCHREALTIME/./} / 1000 ))
Đây là phần mở rộng cho những gì @pellucide đã làm, nhưng đối với máy Mac:
Để xác định số giây kể từ kỷ nguyên (ngày 1 tháng 1 năm 1970) cho bất kỳ ngày nào (ví dụ: ngày 21 tháng 10 năm 1973)
$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800
Xin lưu ý rằng để hoàn thiện, tôi đã thêm phần thời gian vào định dạng. Lý do là date
sẽ lấy bất kỳ phần ngày nào bạn đã cung cấp và thêm thời gian hiện tại vào giá trị được cung cấp. Ví dụ: nếu bạn thực hiện lệnh trên vào lúc 4:19 PM, không có phần '00: 00: 00 ', nó sẽ tự động thêm thời gian. Như vậy "ngày 21 tháng 10 năm 1973" sẽ được phân tích thành "ngày 21 tháng 10 năm 1973 16:19:00". Đó có thể không phải những gì bạn muốn.
Để chuyển đổi dấu thời gian của bạn trở lại một ngày:
$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973
Trang người đàn ông của Apple để thực hiện ngày: https://developer.apple.com/l Library / mac / documentation / Darwin / Reference / Manager / man1 / date.1.html
date
lệnh, trong khi bất kỳ giải pháp gợi ý date -d
dành cho GNU date
. Ngày BSD trong macOS đến từ FreeBSD và chia sẻ một số tùy chọn với NetBSD và OpenBSD. Và điều này hoàn toàn tách biệt với bash.
%N
lựa chọn đề cập đến cho giây phân đoạn trong ngày gnu là mất tích kể từ ngày hệ điều hành MacOS. Vào ngày 10.14, không có định dạng nào trong trang man; chúng ở trong strftime(3)
trang người đàn ông mà bạn sẽ không có nếu bạn chưa cài đặt Xcode và có thể không thấy bằng lệnh man ngay cả khi bạn làm như vậy.