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).
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:
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
@
artinya ini date -d @1234567890
? man date
tidak menyebut
info date
cukup lengkap. Entri di 28.9 Seconds since the Epoch
menjelaskan secara terperinci tentang @timestamp.
$ 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)
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
Dengan bash-4.2
atau di atas:
printf '%(%F %T)T\n' 1234567890
(di mana %F %T
adalah strftime()
format yang -type)
Sintaksis itu diilhami dari ksh93
.
Dalam ksh93
Namun, argumen yang diambil sebagai ekspresi tanggal di mana berbagai dan hampir tidak didokumentasikan format yang didukung.
Untuk waktu Unix, sintaks dalam ksh93
adalah:
printf '%(%F %T)T\n' '#1234567890'
ksh93
Namun 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
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.
Dengan zsh
Anda bisa menggunakan strftime
builtin:
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 dateconv
dari dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Jumat, 13 Feb 2009
ingat selalu dateutils
alat bawaan untuk UTC
(tambahkan -z your/timezone
jika perlu).
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
Tidak akan menjadi solusi nyata tanpa node.js kecil:
epoch2date(){
node -p "new Date($1)"
}
tambahkan itu ke ~/.bash_aliases
dan pastikan bersumber ~/.bashrc
dengan. ~/.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-remote
dan pilih satu versi nvm install <version>
.
Ada cara yang lebih mudah untuk melakukan ini: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")