it-swarm-vi.com

Làm cách nào để chuyển đổi dấu thời gian Epoch sang định dạng có thể đọc được trên cli?

Làm cách nào để chuyển đổi dấu thời gian Epoch sang đị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).

196
xenoterracide

Trên * BSD:

date -r 1234567890

Trên Linux (cụ thể, với GNU coreutils 5.3):

date -d @1234567890

Với các phiên bản cũ hơn GNU ngày, bạn có thể tính toán sự khác biệt tương đối 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 đã hết may mắn. Lần duy nhất bạn có thể định dạng bằng lệnh POSIX Shell (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
296

date -d @1190000000 Thay thế 1190000000 bằng Epoch của bạn

28
fschmitt
$ 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 Epoch 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)
14
Stefan Lasiewski

Đị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); }'

Đã liên kết SO câu hỏi: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

12
Ivan Chau

Nếu thời gian Epoch 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.
12
KnockTurnAl

Với bash-4.2 Trở lên:

printf '%(%F %T)T\n' 1234567890

(trong đó %F %T là định dạng strftime()-)

Cú pháp đó được lấy cảm hứng từ ksh93.

Tuy nhiên, trong ksh93, Đối số được lấy dưới dạng biểu thức ngày trong đó các định dạng khác nhau và hầu như không được ghi lại.

Đối với thời gian Unix Epoch, 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
11
Stéphane Chazelas

Hai cái tôi thường xuyên sử dụng là:

$ Perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009

$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009
7
al.

Với zsh bạn có thể sử dụng strftime dựng sẵn:

strftime định dạng epochtime[.__.] [.__.] Xuất ra ngày được biểu thị bởi thời gian bên trong định dạng quy định.

ví dụ.

zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Thứ Sáu, ngày 13 tháng 2 năm 2009

Ngoài ra còn 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

hãy ghi nhớ dateutils công cụ mặc định là UTC (thêm -z your/timezone Nếu cần thiết).

7
don_crissti

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ởi 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
0
Meow

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à đảm bảo nguồn gốc của nó trong ~/.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 goto 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ỉ loại nvm ls-remote và chọn một phiên bản để nvm install <version>.

0
chovy

Trong PowerShell :

(([System.DateTimeOffset]::FromUnixTimeMilliSeconds($unixtime)).DateTime).ToString("s")
0
Kulwinder Singh