2009-07-07 42 views
396

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 hiện tại, giờ, phút và giây.Nhận thời gian hiện tại tính bằng giây từ Epoch trên Linux, Bash

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

+18

Xin lỗi, tôi phải nói điều này .... '' Ngày không có vẻ để phục vụ tùy chọn đó. Có một cách dễ dàng? '' - đọc hướng dẫn một lần nữa ;-) – TheBonsai

+5

Một số phiên bản của ngày có nó và một số thì 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à đã hoạt động. –

+0

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

Trả lời

747

này nên làm việc:

date +%s 
+27

ngày manpge nên được thay đổi từ '% s giây từ 1970-01-01 00:00:00 UTC' thành'% s giây kể từ kỷ nguyên , 1970-01-01 00:00:00 UTC' vì tôi đã bỏ lỡ nó ở đó. – devin

+3

Không hiệu quả với tôi. ngày người đàn ông không hiển thị% s. Tôi phải có phiên bản bash rất cũ (3.2.51 (1) cho Solaris)? – livefree75

+3

@ livefree75 'date' không được tích hợp vào' bash', vì vậy phiên bản 'bash' của bạn không có gì liên quan đến việc' ngày' triển khai hệ thống của bạn với. –

91

Chỉ cần thêm. Nếu bạn muốn nhận được giây kể từ thời đại (ngày 1 tháng 1 năm 1970) cho bất kỳ ngày cụ thể 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 là khá linh hoạt. Một điều thú vị khác bạn có thể làm với ngày (không biết sao chép từ date --help). Hiện giờ địa phương cho 09:00 thứ sáu tới trên bờ biển phía tây của Mỹ

date --date='TZ="America/Los_Angeles" 09:00 next Fri' 

Hơn thế nữa, mất một thời gian để đọc man page http://www.manpages.info/linux/date.1.html

14

Đây là một phần mở rộng với những gì đã làm @pellucide , nhưng dành cho 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 cụ thể (ví dụ như Oct 21 1973)

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s" 
120034800 

Xin lưu ý rằng để hoàn thành, 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 thi lệnh trên 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 cú pháp là "ngày 21 tháng 10 năm 1973 16:19:00". Đó có thể không phải là điều 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 

man page của Apple để thực hiện date: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

23

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.

Từ Bash 4.2, printf có một sửa đổi mới %(dateformat)T rằng, khi được sử dụng với lập luận -1 kết quả đầu ra ngày hiện tại với định dạng do dateformat, xử lý bởi strftime(3) (man 3 strftime cho thông tin về các định dạng).

Vì vậy, một giải pháp Bash tinh khiết:

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 chương trình bên ngoài và không có subshells!

Từ Bash 4.3, nó thậm chí có thể không xác định -1:

printf -v var '%(%s)T' 

(nhưng nó có thể là khôn ngoan để luôn luôn cung cấp cho các lập luận -1 dù sao).

Nếu bạn sử dụng -2 làm đối số thay vì -1, Bash sẽ sử dụng thời gian vỏ được bắt đầu thay vì ngày hiện tại (nhưng tại sao bạn muốn điều này?).

+4

Bạn muốn sử dụng' -2' trong trường hợp bạn có một công việc dài hơn kiểm soát bạn sao lưu) và gửi một thư ở cuối "Sao lưu 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. –

1

sử dụng kịch bản bash này (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" "[email protected]" 
6

Với hầu hết các trường AWK:

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

Chà là mơ hồ – ericslaw

+1

Ồ, 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. [Dường như việc triển khai awk 'srand()'] (https://www.gnu.org/software/gawk/manual/html_node/Numeric-Functions.html) thường được tạo giống với ngày/giờ hiện tại. Lệnh gọi thứ hai 'srand()' trả về giá trị trước đó được sử dụng làm hạt giống. –

Các vấn đề liên quan