Sadece kullanın dateve 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 agofarklı 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ı datekomut 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 agoyoksa -d 2 hour agotekrar mı?" veya "Öyle mi -d yesterdayyoksa -d 1 day agoistediğ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: %()Tbiçimlendiriciye hiçbir argüman varsayılan kabul edemeyeceğini belirten manpage rağmen, -1onun yerine 0 olsun gibi görünüyor (teşekkür ederim, bash manuel sürüm 4.3.48)