Chuyển đổi dấu thời gian Unix thành chuỗi ngày


126

Có cách nào nhanh chóng để chuyển đổi dấu thời gian Unix thành ngày từ dòng lệnh Unix không?

datecó thể hoạt động, ngoại trừ việc chỉ định từng yếu tố (tháng, ngày, năm, giờ, v.v.) và tôi không thể tìm ra cách làm cho nó hoạt động bình thường. Có vẻ như có thể có một cách dễ dàng hơn - tôi có đang thiếu thứ gì không?


Câu trả lời:


179

Với GNU, datebạn có thể làm:

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

(Từ: BASH: Chuyển đổi Dấu thời gian Unix thành Ngày )

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ừ vỏ, nhưng bạn có thể truy cập nó qua gawk . Trình %cxác định hiển thị dấu thời gian theo cách phụ thuộc miền địa phương.

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

3
Đảm bảo loại bỏ mili giây khỏi dấu thời gian (chỉ có 10 chữ số thay vì 13), nếu không bạn sẽ nhận được kết quả không hợp lệ (điều này đúng với ngày của macOS).
emerino

Tôi nghĩ rằng điều này không hiệu quả, cho đến khi tôi nhận ra mình có dấu thời gian tính bằng millis. Cắt bỏ 3 chữ số cuối và bạn có được thời gian chính xác
Stewart

64

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' Trong đó số phía sau @là số tính bằng giây


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

Hoạt động cho Ubuntu 16.04
Mike Q

24

Giải pháp này hoạt động với các phiên bản ngày 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à chỉ định UTC.

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

Nếu bạn đang dùng Mac, hãy sử dụng:

date -r 1357004952

Lệnh nhận epoch:

date +%s
1357004952

Tín dụng cho Anton: BASH: Chuyển đổi Dấu thời gian Unix thành Ngày


10

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à một giải pháp đơn giản phổ biến hơn (nghĩa là được triển khai rộng rãi hơn) trong vài giây kể từ Unix Epoch, nhưng không may là không có giải pháp di động được bảo đảm phổ quát.

Các -dtùy chọn trên nhiều loại hệ thống có nghĩa là một cái gì đó hoàn toàn khác biệt so với GNU ngày của --datephần mở rộng. Đáng buồn là Ngày GNU không diễn giải -rgiống như các triển khai khác. Thật không may, bạn phải biết phiên bản datenào bạn đang sử dụng và nhiều datelệnh Unix cũ hơn không hỗ trợ tùy chọn nào.

Thậm chí tệ hơn, POSIX datekhông nhận ra -dhoặc cũng không -rcung cấp cách chuẩn nào trong bất kỳ lệnh nào (mà tôi biết) để định dạng thời gian Unix từ dòng lệnh (vì POSIX Awk cũng thiếu strftime()). (Bạn không thể sử dụng touch -tlsvì trước đây không chấp nhận thời gian là giây kể từ Unix Epoch.)

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


4

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


2

Điều chỉnh nhẹ cho câu trả lời của dabest1 ở trên. Chỉ định múi giờ là UTC, không phải 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 năm 1971.


2

Giải pháp Perl tiêu chuẩn là:

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

(hoặc giờ địa phương, nếu thích)



1

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

date -r 1305712800

Kết quả hỗn hợp: không hoạt động trong Ubuntu Linux nhưng làm trong Mac OS X chẳng hạn.
Mike Q

1

Đặt phần sau vào ~ / .bashrc:

function unixts() { date -d "@$1"; }

Ví dụ sử dụng:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019

-1

Con trăn

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
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.