Unix zaman damgasını bir tarih dizesine dönüştürün


128

Unix zaman damgasını Unix komut satırından bir tarihe dönüştürmenin hızlı ve tek satırlık bir yolu var mı?

dateişe yarayabilir, ancak her bir öğeyi (ay, gün, yıl, saat vb.) belirtmek oldukça garip ve onu nasıl düzgün bir şekilde çalıştıracağımı bulamıyorum. Görünüşe göre daha kolay bir yol olabilir - bir şey mi kaçırıyorum?


Yanıtlar:


181

GNU'lar ile dateşunları yapabilirsiniz:

date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969

(Kimden: BASH: Unix Zaman Damgasını Tarihe Dönüştür )

OS X'te kullanın date -r.

date -r "$TIMESTAMP"

Alternatif olarak, kullanın strftime(). Doğrudan kabuktan kullanılamaz, ancak ona gawk aracılığıyla erişebilirsiniz . %cBelirteci bir yerel bağımlı bir şekilde zaman damgası görüntüler.

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST

3
Zaman damgasından milisaniyeleri çıkardığınızdan emin olun (bu, 13 yerine yalnızca 10 basamaktır), aksi takdirde geçersiz sonuçlar alırsınız (bu, macOS'un tarihi için geçerlidir).
emerino

Milis cinsinden bir zaman damgam olduğunu fark edene kadar bunun işe yaramadığını düşündüm. Son 3 basamağı kesin ve doğru zamanı elde edin
Stewart

64

date -d @1278999698 +'%Y-%m-%d %H:%M:%S'@Saniyedeki sayı arkadaki sayıdır


28
OSX 10.8'de date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) veya basitçedate -r 1278999698
Tom McKenzie

Ubuntu 16.04 için çalışıyor
Mike Q

24

Bu çözüm, desteklemeyen tarih sürümleriyle çalışır date -d @. AWK veya diğer komutları gerektirmez . Bir Unix zaman damgası, 1 Ocak 1970 UTC'den bu yana geçen saniye sayısıdır, bu nedenle UTC'yi belirtmek önemlidir.

date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012

Mac kullanıyorsanız, şunu kullanın:

date -r 1357004952

Dönem alma komutu:

date +%s
1357004952

Kredi Anton'a gider: BASH: Unix Zaman Damgasını Tarihe Dönüştür


10

@TomMcKenzie'nin başka bir cevaba yaptığı yorumda söylediği gibi, date -r 123456789 bu yana saniyeler olarak verilen zamanlar için tartışmasız daha yaygın (yani daha yaygın olarak uygulanan) basit bir çözüm, ancak ne yazık ki evrensel garantili taşınabilir bir çözüm yok.

-dSistemlerinin birçok türlerinde seçenek GNU tarihten en fazla tamamen farklı bir şey ifade --dateuzantısı. Ne yazık ki GNU Date -rbu diğer uygulamalarla aynı şeyi yorumlamıyor . Bu yüzden ne yazık ki hangi sürümünü kullandığınızı bilmeniz gerekiyor dateve birçok eski Unix datekomutu her iki seçeneği de desteklemiyor.

Daha da kötüsü, POSIX , komut satırından bir Unix zamanını biçimlendirmek için hiçbir komutta (benim bildiğim kadarıyla) datene tanır ne -dde -rstandart bir yol sunmaz (çünkü POSIX Awk de eksiktir strftime()). ( touch -tVe kullanamazsınızls eski nedeniyle Unix Zaman beri saniye olarak verilen bir zaman kabul etmez.)

Brian Kernighan'dan doğrudan temin edilebilen The One True Awk artık strftime()yerleşik bir systime()işleve ve Unix Epoch'tan bu yana geçerli zamanı saniyeler içinde döndüren bir işleve sahip olsa da, belki de Awk çözümü en taşınabilir çözümdür.


4

Gösterimi garip bulursanız, -R-seçeneği yardımcı olabilir. RFC 2822 biçiminde tarihi geride bırakır. Tüm bu tanımlayıcıları gerekmez Yani: date -d @1278999698 -R. Bir başka olasılık çıkışına yerdeki saniyede tarihtir: date -d @1278999698 +%c. Hatırlaması kolay olmalı. :-)


2

Yukarıdaki dabest1'in cevabına küçük bir düzeltme. Saat dilimini GMT olarak değil, UTC olarak belirtin:

$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014

İkincisi doğru. Bence bunun nedeni, İngiltere'de 1968'den 1971'e kadar gün ışığından yararlanmanın sürekli olarak yürürlükte olması.


2

Standart Perl çözümü:

echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'

(veya tercih edilirse yerel zaman)


1
awk 'BEGIN { print strftime("%c", 1271603087); }'

1

Buradaki diğer örnekleri hatırlamak zordur. En basit haliyle:

date -r 1305712800

Karışık sonuçlar: ubuntu Linux'ta çalışmaz, ancak örneğin Mac OS X'te çalışır.
Mike Q

1

Aşağıdakileri ~ / .bashrc dosyanıza koyun:

function unixts() { date -d "@$1"; }

Örnek kullanım:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019

-1

Python:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
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.