آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پرسش و پاسخ شماره ۱۰۲

پرسش و پاسخ شماره ۱۰۲

چگونه اختلاف بین دو تاریخ را به دست آورم؟

بهترین کار آنست که در سراسر کُد خود با نشانه‌های زمان (timestamps) کار کنید، و سپس برای خروجی، این نشانه‌ها را به شکل قابل خواندن انسانی تبدیل نمایید. اگر شما با ورودی قابل خواندن انسانی سر و کار دارید، پس به چیزی که بتواند آنها را تجزیه کند نیاز خواهید داشت.

استفاده از date گنو، برای مثال:

# (وقت محلی) ‎Jan 1, 2010‎ به دست آوردن ثانیه‌های سپری شده از‎
then=$(date -d "2010-01-01 00:00:00" +%s)
now=$(date +%s)
echo $(($now - $then))

برای چاپ مدت زمان به صورت قابل خواندن انسانی، نیاز به انجام مقداری محاسبه خواهید داشت:

# تعریف تعدادی از ثابت‌ها‎
minute_secs=60 hour_secs=$((60 * minute_secs)) day_secs=$((24 * hour_secs))
# به دست آوردن کل مدت‎
seconds_since=$(($now - $then))
# تفکیک‎
days=$((seconds_since / day_secs))
hours=$((seconds_since % day_secs / hour_secs))
minutes=$((seconds_since % day_secs % hour_secs / minute_secs))
seconds=$((seconds_since % day_secs % hour_secs % minute_secs))
# چاپ شکیل‎
echo "$days days, $hours hours, $minutes minutes and $seconds seconds."

یا، بدون برچسب‌های تفصیلی:

# Bash/ksh
((duration = now - then))
((days = duration / 86400))
((duration %= 86400))
((hours = duration / 3600))
((duration %= 3600))
((minutes = duration / 60))
((seconds = duration % 60))
echo "$days days, $hours hours, $minutes minutes and $seconds seconds."

برای تبدیل نشانه‌های زمان به تاریخ قابل خواندن انسانی، استفاده از نگارشهای اخیرdate گنو:

date -d "@$now"

( برای اطلاعات بیشتر در باره تبدیل نشانه‌های زمان یونیکس به تاریخ قابل خواندن انسانی پرسش و پاسخ شماره 70 را ببینید.)


CategoryShell

پرسش و پاسخ 102 (آخرین ویرایش ‎2010-07-30 13:46:05‎ توسط GreyCat