Bir UNIX zaman damgası için biçimlendirilmiş bir tarihi komut satırından nasıl alabilirim


59

Bir UNIX zaman damgasına sahibim dateve bu zaman damgasına karşılık gelen (çıktısı gibi) biçimlendirilmiş bir tarih almak istiyorum .

Şimdiye kadar yaptığım girişimler:

$ date +%s
1282367908
$ date -d 1282367908
date: invalid date `1282367908'
$ date -d +1282367908
date: invalid date `+1282367908'
$ date +%s -d +1282367908
date: invalid date `+1282367908'

Gibi çıktı elde edebilmek istiyorum:

$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010

Yanıtlar:


91

Mac OS X ve BSD'de:

$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d
2010-08-21

GNU çekirdek araçlarıyla (bunun için bilgi dosyasını incelemelisiniz):

$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date
2010-08-21

Ya sayesinde ekleyin -u(standart) seçeneği ya da bir geçiş TZ=UTC0UTC tarihine sahip çevre değişkeni ( TZ=UTC0 tanımlayan adı verilen bir zaman dilimi UTCiçin davranış ederken ile UTC 0 ofset TZ=UTCkayma olmayacak () (belirtilmemiş Birçok sistemin bir bakın olur üzerinde olsa sistem tanımlı zaman dilimi ayrıca UTCUTC'den ofset 0 olarak da adlandırılır )).


1
Yine de bu kadar yaygın bir iş için şaşırtıcı olan çok fazla kazma gerektirir.
David Z,

Teşekkürler, cevabınızı kabul ettiniz. info coreutils dateBiraz daha dikkatli okumalıydım .
Umang

Bu bana biraz farklı bir tarih veriyor: date -r 1447264553943sonuçta Wed Dec 28 01:39:03 BRST 47831aslında 11/11/2015, 3:55:53 PM GMT-2:00.
Kasım’daki

1
@ falmp: Mikrosaniye yerine saniye kullanırsanız işe yarar.

@hop ops, senenin 47831 olduğu düşünülmeliydi, ama bu sayı o kadar yüksekti ki, onu özledim. Teşekkürler!
saat

6

Bazı googlinglerden sonra, datesadece komutla yapmanın bir yolunu buldum :

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010

Bunun için teşekkürler. Daha basit bir şey olacağını umuyordum, bu yüzden şimdilik sadece yukarı oy.
Umang

google'ın seni nasıl aptallaştırdığına dair başka bir harika örnek. Artık kimse belgeleri okumuyor mu?

1
@hop, date -d @xxx2005'te 5.3'e kadar coreutils'e kadar destek eklenmedi. Bundan önce bunu yapmanız gerekiyordu.
Stéphane Chazelas 7:16

@ StéphaneChazelas: a) bu cevap 2010'dan itibaren ve b) neden belgeleri okumadan önce bu googling'i mazur görüyor? Kendi otoritenizden cevap verirseniz, böyle bir hata yapmak bahane edebilir, ancak yine de bakmak zorunda kalırsanız, doğru şekilde arayın.

@hop, sadece aptal bir cevap olmadığını, sadece modası geçmiş bir cevap olduğuna işaret ediyordum.
Stéphane Chazelas 7:16

6

Bu perl bir liner yapacak:

$ perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010

5

Kabuk yerleşikleri ile:

  • zsh (4.1.1 (2003) ve üzeri):

    $ zmodload zsh/datetime
    $ TZ=UTC0 strftime %c 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    
  • ksh93( ksh93i(2000) ve üzeri):

    $ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
    Sat Aug 21 05:25:45 2010
    
  • bash (4.2 (2010) ve üzeri):

    $ TZ=UTC0 printf '%(%c)T\n' 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    

Bunların hepsinde, istediğiniz format %cile değiştirin strftime().


bash printfÇözüm için bir referansınız var mı?
Derek Mahar

Boşverin, açıklamasında buldum printfiçinde gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Derek Mahar

2

Osx’te UTC’de olması

date -r "1475737200" -u

Teşekkürler. Bilginin daha kolay ulaşılabilmesi için kabul edilen yanıtta düzenleme yaptım.
Stéphane Chazelas

1

Modern Unix'in zengin mirasının bir başka zarif örneği. Bu, çoğu BSD varyantında mümkündür:

$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010

(Örneğinizin BTW'si bir saniye kapalı görünüyor)


Linux'ta çalışmıyor. hop'un cevabı, doğru Linux cevabı gibi görünüyor. Gösterdiğin için teşekkürler, böyle bir şey olacağından şüphelendim, şimdi 45 saniye yaptım.
Umang

1

Eski bir sorunun cevabını verin, ancak bunun için başkası ararsa bunun bir gelişme olabileceğini düşünüyorum. Bu Bash işlevi hem Linux hem de OS X'de çalışır. Başka hiçbir BSD sisteminde test etmedim. Çağrının zamanını bu işlevin argümanı olarak iletin ve RFC-3339 zaman biçimini yazdıracaktır.

epochtorfc3339 ()
{
    RFC3339_FORMAT="+%FT%T:::%z"
    EPOCH=$(echo $@ | sed -n "s/.*\([0-9]\{10\}\).*/\1/p");
    if date --version >/dev/null 2>/dev/null; then
        # Linux
        date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${EPOCH} seconds"
        #date -d @${EPOCH} --rfc-3339=seconds
    else
        # OS X/BSD
        date -r ${EPOCH} ${RFC3339_FORMAT}
    fi
}
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.