Bir devir zaman damgasını cli üzerinde insan tarafından okunabilir bir formata nasıl dönüştürebilirim? Tarih ile yapmanın bir yolu olduğunu düşünüyorum ama sözdizimi beni atlatır (başka yollar hoş geldiniz).
Bir devir zaman damgasını cli üzerinde insan tarafından okunabilir bir formata nasıl dönüştürebilirim? Tarih ile yapmanın bir yolu olduğunu düşünüyorum ama sözdizimi beni atlatır (başka yollar hoş geldiniz).
Yanıtlar:
Açık * BSD:
date -r 1234567890
Linux'ta (özellikle, GNU coreutils ≥5.3 ile):
date -d @1234567890
GNU tarihinin eski sürümleriyle, UTC dönemine olan göreceli farkı hesaplayabilirsiniz:
date -d '1970-01-01 UTC + 1234567890 seconds'
Taşınabilirliğe ihtiyacınız varsa, şansınız yok demektir. POSIX kabuk komutuyla (kendiniz hesaplama yapmadan) satırını biçimlendirebileceğiniz tek zaman geçerli saattir. Uygulamada, Perl genellikle mevcuttur:
perl -le 'print scalar localtime $ARGV[0]' 1234567890
@
anlamı ne date -d @1234567890
? man date
buna atıf
info date
Oldukça tamamlandı. ' 28.9 Seconds since the Epoch
Daki girdi @timestamp ile ilgili ayrıntılı bilgi veriyor.
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e'
Sun Sep 16 20:33:20 2007
Bu, günlük zamanlarında epoch zamanını kullanan uygulamalar için kullanışlı olabilir:
$ 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)
GNU ile özel format date
:
date -d @1234567890 +'%Y-%m-%d %H:%M:%S'
Veya GNU ile awk
:
awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'
Bağlantılı SO sorusu: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
İle bash-4.2
veya üstü:
printf '%(%F %T)T\n' 1234567890
(burada %F %T
bir strftime()
tipi biçimi)
Bu sözdiziminden ilham alındı ksh93
.
Bununla ksh93
birlikte, argüman, çeşitli ve neredeyse belgelenmemiş formatların desteklendiği bir tarih ifadesi olarak alınır.
Bir Unix dönemi için, sözdizimi in ksh93
:
printf '%(%F %T)T\n' '#1234567890'
ksh93
ancak, zaman dilimi için kendi algoritmasını kullanıyor gibi görünüyor ve yanlış anlayabilirsiniz. Örneğin, İngiltere’de, 1970’te tüm yıl yaz mevsimiydi, fakat:
$ 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
Çağrınızın süresi saniye yerine milisaniye ise, son üç haneyi geçmeden önce kaldırın date -d
:
$ date -d @1455086371603
Tue Nov 7 02:46:43 PST 48079 #Incorrect
Bu yanlış veri verir. Son üç rakamı kaldırın.
$ 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.
İle zsh
şunu kullanabilirsiniz strftime
yerleşiğini:
strftime format epochtime Çıktı tarih ile gösterilir epochtime içinde biçiminde belirtilmiş.
Örneğin
zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
13 Şubat 2009 Cuma
Şunlardan da dateconv
var dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
13 Şubat 2009 Cuma
dateutils
araçları varsayılan olarak aklınızda bulundurun UTC
( -z your/timezone
gerekirse ekleyin ).
Tarih saatini doğrudan kabukla ayrıştırılabilecek biçimde yazdırmak için küçük bir C programı da kullanabilirsiniz.
#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;
}
kullanımı:
#compile
clang -o epoch2datetime main.c
#invoke
eval `./epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11
Küçük bir node.js olmadan gerçek bir çözüm olmazdı:
epoch2date(){
node -p "new Date($1)"
}
o ekleyebilir ~/.bash_aliases
ve de kaynaklı emin olun ~/.bashrc
ile. ~/.bash_aliases
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Sisteminizde düğüm almak için http://nvm.sh dosyasına gidin ve curl komutunu çalıştırın. Düğüm sürümlerini değiştirmenize olanak sağlayan düğüm sürüm yöneticisi (nvm) yüklenir.
Sadece nvm ls-remote
bir versiyon yazıp seçin nvm install <version>
.
Bunu yapmanın daha kolay bir yolu var: (([[System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")