1/1/1970 tarihinden İtibaren Günleri Hesapla


10

1/1/1970 tarihinden bu yana geçen gün sayısını nasıl hesaplayabilirsiniz? Bu, OpenLDAP üzerindeki shadowLastChange özniteliğini güncellemek içindir .

Bunu linux date komutunu kullanarak yapmanın bir yolu var mı ?


Bash ve Bourne'den türetilmiş kabukların çoğunda, okunabilirlik ve diğer nedenlerden ötürü$() backticks'e tercih edilir . echo $(( $(date ...) / 86400 ))
sonraki duyuruya kadar duraklatıldı.

Henüz 2000 yok ... Birisi başlığı düzenleyebilir ve düzeltebilir :-)
Yüzük Ø

Yanıtlar:


20

ring0 beni birkaç saniye dövdü, ama tam komut:

echo $(($(date --utc --date "$1" +%s)/86400))

Bu UTC saatine göre değişir. Sonuç:

root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984

Bir Wolfram Alpha ile hızlı check bu doğru değeri olduğunu gösterir.


1
artık saniye ne olacak? :)
netvope

1
@netvope Ek bir saniye daha sonra, unix süresi bir kez daha sıfırlanır. Yani her gün tam olarak 86400 unix saniye ekliyor. 59: 60 ve 1999-01-01T00: 00: Fakat unix zaman 915148800 hem UTC 1998-12-31T23 için durabilir 00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski

9

dateKomut size beri saniye sayısını verebilir 1970-01-01 00:00:00 UTC.

  date +"%s"

3600*24Gün sayısını (UTC) almak için sonucu ile bölebilirsiniz .

Örn. Bash

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

gün sayısını görüntülemek için.


9

Bence bu en basit yöntem:

expr $(date +%s) / 86400

Bu neden reddedildi? Bu en iyi ve en kısa ve en basit cevap
Tom Corelis

1

Bunu da çözmem gerekiyordu, ancak günün saatine bakılmaksızın # gün için aynı değeri elde etmek istedim. Burada gösterilenler gibi yaklaşımlarda değer, gece yarısı yerel saati yerine UTC gece yarısı değişecektir. Bu muhtemelen AB veya ABD Doğu Kıyısı'nda UTC'ye yeterince yakın olan ve gün değerinin tipik iş gününün ortasında değişmeyeceği, ancak örneğin California'da gün değişikliği gibi bir sorun gibi görünmüyor. uygunsuz olabilir 4 PST de meydana gelecektir. Avustralyalıların özellikle sabahın sonlarında gün değerinin değişmesinden rahatsız olacaklarını düşünüyorum.

Bunu düzeltmek istiyorsak, saniyeye / güne bölmeden önce UTC'den ofseti eklememiz gerekir. Neyse ki, Linux tarih komutu UTC'den ofseti raporlayan bir % z biçim dizisi içerir. Standart format (bu sonuç Denver zamanı, MDT için) iken:

$ date +%z
-0600

. . . bir hesaplamada doğrudan kullanılamazsa, doğru değiştiriciler istediğimizi verir:

$ date +%-:::z
-6

Bunu her zamanki saniye / saat / gün dönüşümleri ile birlikte koyun ve aşağıdakilerin 1/1/1970 tarihinden bu yana günlerin çıktısını alması gerektiğine inanıyorum, 1/1/1970'in kendisi sıfır günü ve yerel gece yarısı saatindeki değer artar:

echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))

Bu basit hesaplama, UTC'den tam saatlere kadar dengelenmeyen saat dilimleri için (örneğin, Hindistan, TZ = Asya / Kalküta) date +%-:::zçalışmaz , çünkü tarafından üretilen "+5: 30" "ifadede geçersiz karakter" hatası üretir Yukarıdaki ifadede kullanıldığında.

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.