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).

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

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


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)


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

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.

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

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).


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

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>.


0

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.