Làm cách nào để chuyển đổi dấu thời gian epoch thành định dạng có thể đọc được trên cli? Tôi nghĩ rằng có một cách để làm điều đó với ngày nhưng cú pháp trốn tránh tôi (cách khác được chào đón).
Làm cách nào để chuyển đổi dấu thời gian epoch thành định dạng có thể đọc được trên cli? Tôi nghĩ rằng có một cách để làm điều đó với ngày nhưng cú pháp trốn tránh tôi (cách khác được chào đón).
Câu trả lời:
Trên * BSD:
date -r 1234567890
Trên Linux (cụ thể, với lõi core GNU ≥5.3):
date -d @1234567890
Với các phiên bản cũ hơn của ngày GNU, bạn có thể tính toán sự khác biệt tương đối so với kỷ nguyên UTC:
date -d '1970-01-01 UTC + 1234567890 seconds'
Nếu bạn cần tính di động, bạn không gặp may. Lần duy nhất bạn có thể định dạng bằng lệnh shell POSIX (không tự thực hiện phép tính) là thời gian hiện tại. Trong thực tế, Perl thường có sẵn:
perl -le 'print scalar localtime $ARGV[0]' 1234567890
@
nghĩa là date -d @1234567890
gì trong ? man date
không liên quan đến điều đó ...
info date
này khá đầy đủ. Mục tại 28.9 Seconds since the Epoch
giải thích chi tiết về @timestamp.
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e'
Sun Sep 16 20:33:20 2007
Điều này có thể có ích cho những ứng dụng sử dụng thời gian kỷ nguyên trong logfiles:
$ tail -f /var/log/nagios/nagios.log | perl -pe 's/(\d+)/localtime($1)/e'
[Thu May 13 10:15:46 2010] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;HOSTA;check_raid;0;check_raid.pl: OK (Unit 0 on Controller 0 is OK)
Định dạng tùy chỉnh với GNU date
:
date -d @1234567890 +'%Y-%m-%d %H:%M:%S'
Hoặc với GNU awk
:
awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'
Câu hỏi SO được liên kết: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
Có bash-4.2
hoặc cao hơn:
printf '%(%F %T)T\n' 1234567890
(nơi %F %T
là strftime()
định dạng kiểu)
Cú pháp đó được lấy cảm hứng từ ksh93
.
Trong ksh93
Tuy nhiên, lập luận được thực hiện như là một biểu thức ngày nơi khác nhau và hầu như không ghi nhận các định dạng được hỗ trợ.
Đối với thời gian Unix, cú pháp trong ksh93
là:
printf '%(%F %T)T\n' '#1234567890'
ksh93
tuy nhiên dường như sử dụng thuật toán riêng của mình cho múi giờ và có thể hiểu sai. Ví dụ, ở Anh, đó là thời gian mùa hè cả năm vào năm 1970, nhưng:
$ TZ=Europe/London bash -c 'printf "%(%c)T\n" 0'
Thu 01 Jan 1970 01:00:00 BST
$ TZ=Europe/London ksh93 -c 'printf "%(%c)T\n" "#0"'
Thu Jan 1 00:00:00 1970
Nếu thời gian kỷ nguyên của bạn tính bằng mili giây thay vì giây, hãy xóa ba chữ số cuối cùng trước khi chuyển nó sang date -d
:
$ date -d @1455086371603
Tue Nov 7 02:46:43 PST 48079 #Incorrect
Điều này cung cấp dữ liệu không chính xác. Xóa ba chữ số cuối.
$ date -d @1455086371
Tue Feb 9 22:39:31 PST 2016 #Correct after removing the last three digits. You may remove and round off the last digit too.
Với zsh
bạn có thể sử dụng strftime
nội dung:
định dạng strftime Xuất ngày được biểu thị bằng epochtime theo định dạng được chỉ định.
ví dụ
zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Thứ Sáu, ngày 13 tháng 2 năm 2009
Cũng có dateconv
từ dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Thứ Sáu, ngày 13 tháng 2 năm 2009
ghi nhớ dateutils
các công cụ mặc định UTC
(thêm -z your/timezone
nếu cần).
Bạn cũng có thể sử dụng một chương trình C nhỏ để in datetime theo định dạng có thể được phân tích cú pháp trực tiếp bằng shell
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(int argc, char * argv[]) {
if (argc==1) {
return 1;
}
struct tm input_tm;
char * formatStr = "YEAR=%Y\nMON=%m\nDAY=%d\nHOUR=%H\nMIN=%M\nSEC=%S";
size_t formatSize = strlen(formatStr) + 2;
char * output = (char *)malloc(sizeof(char)*formatSize);
strptime(argv[1],"%s",&input_tm);
strftime(output, formatSize, formatStr, &input_tm);
printf("%s\n",output);
free(output);
return 0;
}
sử dụng:
#compile
clang -o epoch2datetime main.c
#invoke
eval `./epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11
Sẽ không phải là một giải pháp thực sự nếu không có một chút node.js:
epoch2date(){
node -p "new Date($1)"
}
thêm nó vào ~/.bash_aliases
và chắc chắn rằng nó có nguồn gốc ~/.bashrc
với. ~/.bash_aliases
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Để có được nút trên hệ thống của bạn, hãy truy cập http://nvm.sh và chạy lệnh curl. Nó sẽ cài đặt trình quản lý phiên bản nút (nvm) cho phép bạn chuyển đổi các phiên bản của nút.
Chỉ cần gõ nvm ls-remote
và chọn một phiên bản nvm install <version>
.
Có một cách dễ dàng hơn để làm điều này: (([System.DateTime Offerset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")