2010-07-14 47 views
79

Có cách nhanh, một lớp để chuyển đổi dấu thời gian Unix thành một ngày từ dòng lệnh Unix không?Chuyển đổi từ thời gian Unix tại dòng lệnh

'Ngày' có thể hoạt động, ngoại trừ nó khá khó xử để xác định từng phần tử (tháng, ngày, năm, giờ, v.v ...) và tôi không thể tìm ra cách để nó hoạt động bình thường. Nó có vẻ như có thể có một cách dễ dàng hơn - tôi đang thiếu một cái gì đó?

+2

Bạn đang sử dụng vỏ nào? Bash? Zsh? Dấu gạch ngang? –

+0

Bash - quên đề cập! – chimeracoder

+1

bản sao có thể có của [Cách chuyển đổi dấu thời gian thành ngày trong bash?] (Http://stackoverflow.com/questions/2371248/how-to-convert-timestamps-to-dates-in-bash) – user

Trả lời

106

Với GNU của date bạn có thể làm:

date -d "@$TIMESTAMP" 
# date -d @0 
Wed Dec 31 19:00:00 EST 1969 

(Từ: BASH: Convert Unix Timestamp to a Date)

Trên OS X, sử dụng date -r.

date -r "$TIMESTAMP" 

Cách khác, sử dụng strftime(). Nó không có sẵn trực tiếp từ trình bao, nhưng bạn có thể truy cập nó qua gawk. Trình chỉ định %c hiển thị dấu thời gian theo cách phụ thuộc vào ngôn ngữ.

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}' 
# echo 0 | gawk '{print strftime("%c", $0)}' 
Wed 31 Dec 1969 07:00:00 PM EST 
1
awk 'BEGIN { print strftime("%c", 1271603087); }' 
49

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' Trường hợp số đằng sau @ là là số chỉ trong vài giây

+26

Trên OSX 10.8, đó là 'date -r 1278999698 + '% Y-% m-% d% H:% M:% S'' (GMT) hoặc đơn giản là' date -r 1278999698' –

4

Nếu bạn tìm thấy những ký hiệu vụng về, có lẽ các -R -option không giúp đỡ. Nó vượt qua ngày ở định dạng RFC 2822. Vì vậy, bạn sẽ không cần tất cả các số nhận dạng đó: date -d @1278999698 -R. Một khả năng khác là xuất ngày bằng giây trong miền địa phương của bạn: date -d @1278999698 +%c. Nên dễ nhớ. :-)

2

Giải pháp Perl giữa các ý kiến:

echo $TIMESTAMP | perl -nE 'say scalar gmtime $_' 

(hoặc localtime, nếu ưa thích)

18

giải pháp này làm việc với các phiên bản của ngày mà không hỗ trợ date -d @. Nó không yêu cầu AWK hoặc các lệnh khác. Dấu thời gian Unix là số giây kể từ ngày 1 tháng 1 năm 1970, UTC vì vậy điều quan trọng là phải chỉ định UTC.

date -d '1970-01-01 1357004952 sec UTC' 
Mon Dec 31 17:49:12 PST 2012 

Nếu bạn đang ở trên một máy Mac, sau đó sử dụng:

date -r 1357004952 

lệnh cho việc kỷ nguyên:

date +%s 
1357004952 

tín dụng đi vào Anton: BASH: Convert Unix Timestamp to a Date

9

Như @ TomMcKenzie nói trong một bình luận cho một câu trả lời khác, date -r 123456789 được cho là phổ biến hơn (tức là triển khai rộng rãi hơn) giải pháp đơn giản cho thời gian được đưa ra như giây kể từ thời đại Unix, nhưng tiếc là không có giải pháp di động được đảm bảo phổ quát nào.

Tùy chọn -d trên nhiều loại hệ thống có nghĩa là một cái gì đó hoàn toàn khác với tiện ích mở rộng --date của GNU Date. Ngày tháng buồn bã GNU không giải thích -r giống như các triển khai khác này. Rất tiếc, bạn phải biết phiên bản nào của date bạn đang sử dụng và nhiều lệnh Unix date cũ hơn không hỗ trợ một trong hai tùy chọn.

Thậm chí tệ hơn, POSIX date nhận không -d cũng không -r và cung cấp không có cách nào tiêu chuẩn trong bất kỳ lệnh nào cả (mà tôi biết) để định dạng một thời gian Unix từ dòng lệnh (kể từ POSIX AWK cũng thiếu strftime()). (Bạn không thể sử dụng touch -tls vì trước đây không chấp nhận thời gian được cho là giây kể từ Thời đại Unix.)

Lưu ý rằng tính năng One One Awk có sẵn trực tiếp từ Brian Kernighan hiện đã tích hợp chức năng strftime() cũng như chức năng systime() để trả về thời gian hiện tại tính bằng giây kể từ thời đại Unix), vì vậy có lẽ giải pháp Awk là di động nhất.

1

Chỉnh sửa nhẹ cho câu trả lời của dabest1 ở trên. Chỉ định múi giờ là UTC, không phải là GMT:

$ date -d '1970-01-01 1416275583 sec GMT' 
Tue Nov 18 00:53:03 GMT 2014 
$ date -d '1970-01-01 1416275583 sec UTC' 
Tue Nov 18 01:53:03 GMT 2014 

Điều thứ hai là chính xác. Tôi nghĩ lý do là ở Anh, tiết kiệm ánh sáng ban ngày có hiệu lực liên tục từ năm 1968 đến 1971.

+0

Cảm ơn, tôi đã cập nhật câu trả lời của mình. – dabest1

2

Các ví dụ khác ở đây rất khó nhớ. Tại đơn giản nhất:

date -r 1305712800 
Các vấn đề liên quan