Bir dönem zaman damgasını, uçtaki okunabilir bir biçime nasıl dönüştürebilirim?


183

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:


268

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

4
Taşınabilirlik eksikliği hakkındaki yorum için +1 (neden POSIX spec bunu yapmanın bir yolunu içermiyor? Grr)
Richard Hansen

3
Bunun @anlamı ne date -d @1234567890? man datebuna atıf
yapmadım

10
@ChrisMarkle GNU man sayfaları sık sık beceriksizdir. “Tarih dizesi biçimi kolayca burada belgelenmiştir daha karmaşıktır ancak tam bilgi belgelerinde açıklanmıştır.” Şöyle ki: gnu.org/software/coreutils/manual/html_node/...
Gilles

2
info dateOldukça tamamlandı. ' 28.9 Seconds since the EpochDaki girdi @timestamp ile ilgili ayrıntılı bilgi veriyor.

Boruda Linux'ta: tarih + '% s' | xargs -İn buluşma -d @n
Ivan Ogai

26

date -d @1190000000 1190000000’i çağınızla değiştirin


8
GNU tarihini varsayarsak, öyle.
Gilles,

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


11

İle bash-4.2veya üstü:

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

(burada %F %Tbir strftime()tipi biçimi)

Bu sözdiziminden ilham alındı ksh93.

Bununla ksh93birlikte, 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'

ksh93ancak, 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

7

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

Hangi yardımcı program baskıları milisaniye (noktasuz) içeriyordu?

WebLogic Application sunucusunun komut dosyası aracını kullanırken çoğunlukla milisaniye ile veri zaman değerleri döndürdüğünü ve nokta oluşturmadığını gördüm. örneğin, lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl

Anlıyorum. Bu sayfa Ham Zaman Değerini milisaniye cinsinden zaman damgasını doğrular . Teşekkürler.

Atlassian araçları zaman damgalarını milisaniye ile çağın zamanı olarak kaydeder.
Br.Bill

6

Sık kullandığım iki:

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

ve

$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009

6

İle zshşunu kullanabilirsiniz strftimeyerleş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 dateconvvar dateutils:

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
13 Şubat 2009 Cuma

dateutilsaraçları varsayılan olarak aklınızda bulundurun UTC( -z your/timezonegerekirse ekleyin ).


0

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

0

Küçük bir node.js olmadan gerçek bir çözüm olmazdı:

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

o ekleyebilir ~/.bash_aliasesve de kaynaklı emin olun ~/.bashrcile. ~/.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-remotebir versiyon yazıp seçin nvm install <version>.


0

Bunu yapmanın daha kolay bir yolu var: (([[System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")


U & L'ye Hoşgeldiniz! Lütfen, soru etiketlerine bir göz atın: bu kod bazı Unix veya Unix benzeri bir sistemde bir kabukta çalışıyor mu?
fra-san

Bu teknik Microsoft .NET kullanıyor. OP bir MS çözümü aramıyor gibi görünüyor.
user2320464
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.