Bagaimana cara mengonversi cap waktu zaman ke format yang dapat dibaca manusia di cli?

183

Bagaimana cara mengonversi cap waktu zaman ke format yang dapat dibaca manusia di cli? Saya pikir ada cara untuk melakukannya dengan tanggal tetapi sintaks menghindari saya (cara lain selamat datang).

xenoterracide
sumber

Jawaban:

268

Pada * BSD:

date -r 1234567890

Di Linux (khususnya, dengan GNU coreutils ≥5.3):

date -d @1234567890

Dengan tanggal versi GNU yang lebih lama, Anda dapat menghitung perbedaan relatif ke zaman UTC:

date -d '1970-01-01 UTC + 1234567890 seconds'

Jika Anda membutuhkan portabilitas, Anda kurang beruntung. Satu-satunya waktu Anda dapat memformat dengan perintah shell POSIX (tanpa melakukan perhitungan sendiri) adalah waktu saat ini. Dalam praktiknya, Perl sering tersedia:

perl -le 'print scalar localtime $ARGV[0]' 1234567890
Gilles
sumber
4
Beri +1 untuk komentar tentang kurangnya portabilitas (mengapa spec POSIX tidak menyertakan cara untuk melakukan ini? GRR)
Richard Hansen
3
Apa @artinya ini date -d @1234567890? man datetidak menyebut
nyebut tentang
10
@ChrisMarkle Halaman manual GNU seringkali sangat tidak lengkap. “Format tanggal string lebih kompleks daripada mudah didokumentasikan di sini tapi sepenuhnya dijelaskan dalam dokumentasi info.” Untuk wit: gnu.org/software/coreutils/manual/html_node/...
Gilles
2
Ini info datecukup lengkap. Entri di 28.9 Seconds since the Epochmenjelaskan secara terperinci tentang @timestamp.
Di Linux dalam sebuah pipa: date + '% s' | xargs -I n date -d @n
Ivan
26

date -d @1190000000 Ganti 1190000000 dengan zaman Anda

fschmitt
sumber
8
Dengan asumsi tanggal GNU, yaitu.
Gilles
14
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e' 
Sun Sep 16 20:33:20 2007

Ini bisa berguna untuk aplikasi-aplikasi yang menggunakan waktu jaman di file log:

$ 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)
Stefan Lasiewski
sumber
11

Format khusus dengan GNU date:

date -d @1234567890 +'%Y-%m-%d %H:%M:%S'

Atau dengan GNU awk:

awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'

Pertanyaan SO yang ditautkan: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

Ivan Chau
sumber
3
Hanya berfungsi untuk tanggal GNU dan awk GNU. Awk maupun nawk tidak mendukung strftime.
DarkHeart
11

Dengan bash-4.2atau di atas:

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

(di mana %F %Tadalah strftime()format yang -type)

Sintaksis itu diilhami dari ksh93.

Dalam ksh93Namun, argumen yang diambil sebagai ekspresi tanggal di mana berbagai dan hampir tidak didokumentasikan format yang didukung.

Untuk waktu Unix, sintaks dalam ksh93adalah:

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

ksh93Namun tampaknya menggunakan algoritma sendiri untuk zona waktu dan bisa salah. Misalnya, di Inggris, itu musim panas sepanjang tahun di tahun 1970, tetapi:

$ 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
Stéphane Chazelas
sumber
7

Jika waktu Anda dalam milidetik alih-alih detik, hapus tiga digit terakhir sebelum meneruskannya ke date -d:

$ date -d @1455086371603
Tue Nov  7 02:46:43 PST 48079     #Incorrect

Ini memberikan data yang salah. Hapus tiga digit terakhir.

$ 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.
KnockTurnAl
sumber
Cetakan utilitas apa yang termasuk milidetik (tanpa titik)?
Saya telah melihat bahwa server Aplikasi WebLogic sebagian besar mengembalikan nilai waktu data dengan milidetik dan tidak ada titik saat menggunakan alat skrip. mis. lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl
Saya melihat. Halaman ini mengonfirmasi Nilai Waktu Mentah Stempel waktu dalam milidetik . Terima kasih.
Alat-alat Atlassian mencatat cap waktu mereka sebagai zaman dengan milidetik.
Br.Bill
6

Dua yang sering saya gunakan adalah:

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

dan

$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009
Al.
sumber
6

Dengan zshAnda bisa menggunakan strftimebuiltin:

strftime Format epochtime
Keluarkan 
      tanggal yang ditunjukkan oleh zaman dalam format yang ditentukan.

misalnya

zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Jumat, 13 Feb 2009

Ada juga dateconvdari dateutils:

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Jumat, 13 Feb 2009

ingat selalu dateutilsalat bawaan untuk UTC(tambahkan -z your/timezonejika perlu).

don_crissti
sumber
0

Anda juga bisa menggunakan program C kecil untuk mencetak datetime dalam format yang dapat langsung diuraikan oleh 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;
}

pemakaian:

#compile
clang -o epoch2datetime main.c

#invoke
eval `./epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11
meong
sumber
0

Tidak akan menjadi solusi nyata tanpa node.js kecil:

epoch2date(){
    node -p "new Date($1)"
}

tambahkan itu ke ~/.bash_aliasesdan pastikan bersumber ~/.bashrcdengan. ~/.bash_aliases

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Untuk mendapatkan node di sistem Anda goto http://nvm.sh dan jalankan perintah curl. Ini akan menginstal manajer versi simpul (nvm) yang memungkinkan Anda untuk beralih versi simpul.

Cukup ketik nvm ls-remotedan pilih satu versi nvm install <version>.

kenyal
sumber
0

Ada cara yang lebih mudah untuk melakukan ini: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")

Kulwinder Singh
sumber
Selamat datang di U&L! Tolong, lihat tag pertanyaan: apakah kode ini berfungsi di beberapa shell pada beberapa sistem mirip Unix atau Unix?
fra-san
Teknik ini menggunakan Microsoft .NET. Tampaknya OP tidak mencari solusi MS.
user2320464