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?


183

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:


268

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

4
+1 cho nhận xét về việc thiếu tính di động (tại sao thông số POSIX không bao gồm cách thực hiện việc này? Grr)
Richard Hansen

3
@nghĩa là date -d @1234567890gì trong ? man datekhông liên quan đến điều đó ...
Chris Markle

10
Các trang man GNU @ChrisMarkle thường không đầy đủ. “Định dạng ngày chuỗi phức tạp hơn có thể dễ dàng ghi lại ở đây nhưng được mô tả đầy đủ trong tài liệu thông tin.” Để wit: gnu.org/software/coreutils/manual/html_node/...
Gilles

2
Việc info datenày khá đầy đủ. Mục tại 28.9 Seconds since the Epochgiải thích chi tiết về @timestamp.

Trong Linux trong một đường ống: ngày + '% s' | xargs -Tôi ngày -d @n
Ivan Ogai

26

date -d @1190000000 Thay thế 1190000000 bằng kỷ nguyên của bạn


8
Giả sử ngày GNU, đó là.
Gilles

14
$ 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)


11

bash-4.2hoặc cao hơn:

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

(nơi %F %Tstrftime()định dạng kiểu)

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

Trong ksh93Tuy 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 ksh93là:

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

ksh93tuy 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

7

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.

Những tiện ích in bao gồm mili giây (không có dấu chấm)?

Tôi đã thấy rằng máy chủ Ứng dụng WebLogic chủ yếu trả về giá trị thời gian dữ liệu với mili giây và không có dấu chấm khi sử dụng công cụ kịch bản. ví dụ: lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl

Tôi hiểu rồi. Trang này xác nhận giá trị thời gian thô Dấu thời gian tính bằng mili giây . Cảm ơn.

Các công cụ Atlassian ghi lại dấu thời gian của chúng là thời gian kỷ nguyên với mili giây.
Br.Bill

6

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

6

Với zshbạn có thể sử dụng strftimenộ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ó dateconvtừ dateutils:

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Thứ Sáu, ngày 13 tháng 2 năm 2009

ghi nhớ dateutilscác công cụ mặc định UTC(thêm -z your/timezonenếu cần).


0

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

0

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_aliasesvà chắc chắn rằng nó có nguồn gốc ~/.bashrcvớ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-remotevà chọn một phiên bản nvm install <version>.


0

Có một cách dễ dàng hơn để làm điều này: (([System.DateTime Offerset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")


Chào mừng bạn đến với U & L! Xin vui lòng, hãy xem các thẻ của câu hỏi: mã này có hoạt động trong một số vỏ trên một số hệ thống giống như Unix hoặc Unix không?
fra-san

Kỹ thuật này đang sử dụng Microsoft .NET. Dường như OP đang tìm kiếm một giải pháp MS.
dùng2320464
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.