Nhận thời gian hiện tại tính bằng giây kể từ Kỷ nguyên trên Linux, Bash


634

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.

datedường như không cung cấp tùy chọn đó. Có đường nào dễ đi không?


22
Xin lỗi, tôi phải nói điều này .... '' Ngày dường như không cung cấp tùy chọn đó. Có cách nào dễ không? '' - đọc lại hướng dẫn sử dụng ;-)
TheBotto

7
Một số phiên bản của ngày có nó và một số không. Vì vậy, nó không phải lúc nào cũng có mặt. Tôi đã chạy 'type -a date' và sử dụng một phiên bản khác và nó đã hoạt động.
Scott Rowley

1
FWIW, Ubuntu chỉ có / bin / ngày mà câu trả lời của @ Steef hoạt động
Jonathan Hartley

1
@TheBotto không phải là một phần của phiên bản chuẩn POSIX của công cụ 'ngày'. Chỉ vì phiên bản của bạn có nó (có thể là GNU), bạn không nên cho rằng việc triển khai của mọi người là như vậy.
Wyatt8740

Câu trả lời:


1160

Điều này sẽ làm việc:

date +%s

45
các manpge ngày nên được thay đổi từ %s seconds since 1970-01-01 00:00:00 UTCđến %s seconds since the epoch, 1970-01-01 00:00:00 UTCvì tôi đã bỏ lỡ nó trong đó.
devin

3
Không làm việc cho tôi. ngày của người đàn ông không hiển thị% s. Tôi phải có một phiên bản bash rất cũ (3.2.51 (1) cho Solaris)?
livefree75

7
@ livefree75 datekhông được tích hợp bash, vì vậy phiên bản của bạn bashkhông liên quan gì đến việc datetriển khai hệ thống của bạn.
Adrian Frühwirth

11
Và nếu bạn muốn phân số của một giây, đến chín chữ số thập phân, hãy sử dụng:date +%s.%N
Jonathan Hartley

19
Để sử dụng mili giâydate +%s%3N
Juan Campa

133

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 datenà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


Đây không phải là câu hỏi của OP, nhưng nó trả lời tôi, nên +1 từ tôi.
AnthonyD973

Có thể đó là phiên bản datehoặ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" +%skế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]
Joshua Pinter

43

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, printfcó một công cụ sửa đổi mới %(dateformat)T, khi được sử dụng với đối số sẽ đưa -1ra 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 -2là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

9
Bạn muốn sử dụng -2trong 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 -2tránh để lưu trữ một biến chuyên dụng ở đầu.
Sebastian J.

23

Với hầu hết các triển khai Awk:

awk 'BEGIN {srand(); print srand()}'

21
Wow đó là tối nghĩa
ericslaw

8
Wow, phải đi tìm cái này Đây là một giải pháp thực dụng, nhưng không nhất thiết phải tốt / di động. Có vẻ như việc triển khai awksrand() 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.
Ryan Ransford

23

Dung dịch bash nguyên chất

Kể từ bash5.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 EPOCHREALTIMEcó phân số của giây.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIMEcó 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.


Đối với độ phân giải mili giây (cùng định dạng date +%s%3N), bạn có thể sử dụngecho $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212

19

Đâ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à datesẽ 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


1
Để được rõ ràng, đây là cho BSD của datelệnh, trong khi bất kỳ giải pháp gợi ý date -ddà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.
ghoti

các %Nlự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.
Dan Pritts

1

sử dụng tập lệnh bash này (của tôi ~/bin/epoch):

#!/bin/bash

# get seconds since epoch
test "x$1" == x && date +%s && exit 0

# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"
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.