Linux'taki dönemden bu yana saniye cinsinden zamanı alın Bash


633

Gibi basit bir şeye ihtiyacım var date, ama geçerli tarih, saat, dakika ve saniye yerine 1970'den bu yana saniyeler içinde.

datebu seçeneği sunmuyor gibi görünüyor. kolay bir yolu var mı?


22
Üzgünüm, şunu söylemeliyim ki ... '' Tarih bu seçeneği sunmuyor gibi görünüyor. Kolay bir yol var mı? '' - kılavuzu tekrar okuyun ;-)
TheBonsai

7
Tarihin bazı sürümlerinde vardır ve bazılarında yoktur. Yani her zaman mevcut değil. 'Type -a date' çalıştırdım ve farklı bir sürüm kullandım ve bu işe yaradı.
Scott Rowley

1
FWIW, Ubuntu sadece / bin / date'e sahip, @ Steef'in cevabı işe yarıyor
Jonathan Hartley

1
@TheBonsai, 'tarih' aracının POSIX standart sürümünün bir parçası değildir. Sürümünüzde (muhtemelen GNU) olduğu için, herkesin uygulamalarının yapıldığını varsaymamalısınız.
Wyatt8740

Yanıtlar:


1159

Bu çalışmalı:

date +%s

45
tarih manpge den değiştirilmelidir %s seconds since 1970-01-01 00:00:00 UTCiçin %s seconds since the epoch, 1970-01-01 00:00:00 UTCorada onu cevapsız çünkü.
devin

3
Benim için çalışmıyor. adam tarihi% s göstermiyor. Bash'ın çok eski bir sürümüne sahip olmalıyım (Solaris için 3.2.51 (1))?
livefree75

7
@ livefree75 dateyerleşik değildir bash, bu nedenle sürümünüzün sisteminizle bashbirlikte gelen dateuygulama ile hiçbir ilgisi yoktur .
Adrian Frühwirth

11
Ve bir saniyenin kesirlerini dokuz ondalık basamağa istiyorsanız, şunu kullanın:date +%s.%N
Jonathan Hartley

19
Milisaniye kullanım içindate +%s%3N
Juan Campa

133

Sadece eklemek için.

Herhangi bir tarih için (örneğin 1 Ekim 1973) dönemden bu yana geçen saniye sayısını öğrenin (1 Ocak 1970)

date -d "Oct 21 1973" +%s


Saniye sayısını tarihe dönüştürün

date --date @120024000


Komut dateoldukça çok yönlü. Tarihle yapabileceğiniz başka bir harika şey (utanmadan kopyalandı date --help). ABD'nin batı kıyısındaki önümüzdeki Cuma 09:00 için yerel saati göster

date --date='TZ="America/Los_Angeles" 09:00 next Fri'

Daha da iyisi, man sayfasını okumak için biraz zaman ayırın http://man7.org/linux/man-pages/man1/date.1.html


Bu OP'nin sorusu değil, ama benimkini cevaplıyor, bu yüzden benden +1.
1919

Belki de (macOS Catalina) sürümünü datekullanıyorum ya da kullanıyorum çünkü zshbu benim için çalışmıyor. Koşu $ date -d "Oct 21 1973" +%sçıkışlarıusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Joshua Pinter

43

Şimdiye kadar, tüm cevaplar harici programı kullanıyor date.

Bash 4.2 beri printfyeni bir değiştirici vardır %(dateformat)T, argüman kullanıldığında -1verdiği formatı ile geçerli tarih çıkışı dateformattarafından ele, strftime(3)( man 3 strftimebiçimleri hakkında bilgiler için).

Saf bir Bash çözümü için:

printf '%(%s)T\n' -1

veya sonucu bir değişkende depolamanız gerekiyorsa var:

printf -v var '%(%s)T' -1

Harici program ve alt kabuk yok!

Bash 4.3'ten bu yana, aşağıdakileri belirtmek bile mümkün değildir -1:

printf -v var '%(%s)T'

(ancak -1yine de argümanı vermek daha akıllıca olabilir ).

Eğer kullanırsanız -2yerine argüman olarak -1Bash kabuk yerine geçerli tarihi başlandı zaman kullanacaktır. Bu, geçen süreleri hesaplamak için kullanılabilir

$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422

9
Daha -2uzun süre çalışan bir işiniz olması durumunda (yedeklerinizi kontrol etmek için bir komut dosyası düşünün) ve sonunda "Yedekleme $ $ 'dan hemen şimdi tamamlandı" şeklinde bir posta göndermeniz durumunda kullanmak istersiniz - bu, -2bir başında değişken.
Sebastian

23

Çoğu Awk uygulamasıyla:

awk 'BEGIN {srand(); print srand()}'

21
Wow bu belirsiz
ericslaw

8
Vay canına, buna bakmalıydı. Bu pragmatik bir çözümdür, ancak mutlaka iyi / taşınabilir değildir. Awksrand() uygulamalarının tipik olarak geçerli tarih / saat ile tohumlandığı görülmektedir. Daha srand()önce tohum olarak kullanılan değeri döndürmek için ikinci çağrı .
Ryan Ransford

23

Saf bash çözeltisi

5.0'dan beri bash( 7 Ocak 2019'da piyasaya sürüldü ) yerleşik değişkeni kullanabilirsiniz EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

Ayrıca EPOCHREALTIMEsaniye kesirleri de vardır.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIMEondalık noktası kaldırılarak mikro saniyeye (μs) dönüştürülebilir. Yalnızca tamsayıları işleyebilen bashyerleşik aritmetiği kullanırken bu ilgi çekici (( expression ))olabilir.

$ echo ${EPOCHREALTIME/./}
1547624774371215

Yukarıdaki tüm örneklerde daha iyi okunabilirlik için yazdırılan süre değerleri eşittir. Gerçekte, her komutun yürütülmesi biraz zaman aldığı için zaman değerleri farklı olacaktır.


Milisaniye çözünürlük (ile aynı biçimde date +%s%3N) için kullanabilirsinizecho $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212

19

Bu @pellucide'ın yaptıklarının bir uzantısıdır, ancak Mac'ler için:

Herhangi bir tarih için (1 Ocak 1970) dönemden bu yana geçen saniye sayısını belirlemek için (örn. 21 Ekim 1973)

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800

Tamlık için, zaman bölümünü forma eklediğimi lütfen unutmayın. Bunun nedeni, verdiğiniz dateherhangi bir tarih bölümünü alır ve geçerli saati verilen değere ekler . Örneğin, yukarıdaki komutu 16: 19'da, '00: 00: 00' bölümü olmadan yürütürseniz, zamanı otomatik olarak ekler. Öyle ki "21 Ekim 1973", "21 Ekim 1973 16:19:00" olarak ayrıştırılacaktır. İstediğiniz bu olmayabilir.

Zaman damganızı bir tarihe dönüştürmek için:

$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973

Apple'ın tarih uygulaması için kılavuz sayfası: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html


1
Açık olmak gerekirse, bu BSD'nin dateemri için, öneren çözümler date -dGNU içindir date. MacOS'taki BSD tarihi FreeBSD'den gelir ve NetBSD ve OpenBSD ile bir dizi seçeneği paylaşır. Ve bu bash'tan tamamen ayrı .
ghoti

%Ngnu tarihi fraksiyonel saniye belirtilen opsiyon MacOS tarihinden itibaren eksik. 10.14'te formatların hiçbiri kılavuz sayfasında değildir; İçinde bulundukları strftime(3)Xcode yüklü olmayan, ve bunu bile adam komutuyla görmeyebilirsiniz eğer olmaz adam sayfasında.
Dan Pritts

1

şu bash betiğini kullan (my ~/bin/epoch):

#!/bin/bash

# get seconds since epoch
test "x$1" == x && date +%s && exit 0

# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"
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.