Sadece kullanın date
ve güvenilir saniye:
Haklı olarak işaret ettiğiniz gibi, İngilizce zaman aritmetiğine güveniyorsanız, temeldeki hesaplama ile ilgili birçok ayrıntı gizlenir. Örneğin -d yesterday
, ve -d 1 day ago
farklı davranışlar olacaktır.
Bunun yerine, unix dönem UTC'sinden bu yana (tam olarak belgelenmiş) saniyelere ve istediğiniz anı elde etmek için bash aritmetiğine güvenebilirsiniz:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
Bu başka bir cevapta belirtildi . Bu form, farklı date
komut satırı bayraklarına sahip platformlar arasında daha taşınabilir , dilden bağımsızdır (örneğin, Fransız yerelinde "dün" ve "hier") ve açıkçası (uzun vadede) hatırlanması daha kolay olacaktır, çünkü zaten biliyorum. Aksi halde kendinize şu soruyu sorabilirsiniz: "Öyle mi -d 2 hours ago
yoksa -d 2 hour ago
tekrar mı?" veya "Öyle mi -d yesterday
yoksa -d 1 day ago
istediğim mi?"). Burada sadece zor biraz @
.
Bash ve başka bir şeyle silahlı:
Sadece bash üzerinde vurun, printf yerleşimi aracılığıyla dünün zamanını da alabilirsiniz:
%(datefmt)T
causes printf to output the date-time string resulting from using
datefmt as a format string for strftime(3). The corresponding argu‐
ment is an integer representing the number of seconds since the
epoch. Two special argument values may be used: -1 represents the
current time, and -2 represents the time the shell was invoked.
If no argument is specified, conversion behaves as if -1 had
been given.
This is an exception to the usual printf behavior.
Yani,
# inner printf gets you the current unix time in seconds
# outer printf spits it out according to the format
printf "%(%Y-%m-%d)T\n" $(( $(printf "%(%s)T" -1) - 24*3600 ))
veya geçici bir değişkenle eşdeğerdir (dış alt kabuk isteğe bağlıdır, ancak ortamı temiz tutar).
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
Not: %()T
biçimlendiriciye hiçbir argüman varsayılan kabul edemeyeceğini belirten manpage rağmen, -1
onun yerine 0 olsun gibi görünüyor (teşekkür ederim, bash manuel sürüm 4.3.48)