DATEDIFF(1) User Commands DATEDIFF(1)

datediff - محاسبه اختلاف زمانی میان دو تاریخ یا زمان

datediff [OPTION]... DATE/TIME [DATE/TIME]...

محاسبه بازه زمانی از DATE/TIME (تاریخ/زمان مرجع) تا سایر تاریخ/زمان‌های داده‌شده و چاپ نتیجه به عنوان بازه زمانی. اگر سایر تاریخ/زمان‌ها حذف شوند، آن‌ها را از ورودی استاندارد (stdin) می‌خواند.

DATE/TIME همچنین می‌تواند یکی از مقادیر ویژه زیر باشد:

- `now'           به عنوان برچسب زمانی فعلی (UTC) تفسیر می‌شود
- `time'          بخش زمان برچسب زمانی فعلی (UTC)
- `today'         تاریخ فعلی (بر اساس UTC)
- `tomo[rrow]'    تاریخ فردا (بر اساس UTC)
- `y[ester]day'   تاریخ دیروز (بر اساس UTC)

نکته: قالب خروجی بازه‌های زمانی (مشخص‌شده از طریق -f) تمام مشخص‌کننده‌های قالب را در نظر می‌گیرد، به عنوان مثال مشخص کردن %M و %S بازه زمانی را بر حسب دقیقه و ثانیه چاپ می‌کند، در حالی که مشخص کردن تنها %S بازه زمانی را فقط بر حسب ثانیه چاپ می‌کند.

بخش «قاعده پالایش» در datediff(1) را ببینید.

گزینه‌های شناخته‌شده:

چاپ راهنما و خروج
چاپ نسخه و خروج
نادیده گرفتن پیام‌های خطای تجزیه‌کننده تاریخ/زمان و بازه زمانی و اصلاحات خودکار. حالت پیش‌فرض، چاپ یک هشدار یا مقدار اصلاح‌شده و بازگرداندن کد خطای 2 است. همچنین -S|--skip-illegal را برای خروجی دادن یک خط خالی به جای حذف کامل خط ببینید.
منسوخ شده است، از -E|--empty-mode استفاده کنید.
خروجی دادن خطوط خالی به عنوان جای‌نگهدار برای ورودی‌های غیرمجاز، یعنی خطاهای تجزیه‌کننده یا تاریخ/زمان‌هایی که نمی‌توان آن‌ها را از هم تفریق کرد.
قالب خروجی. این می‌تواند یک رشته مشخص‌کننده (مشابه FMT در ()strftime) یا نام یک گاه‌شمار (تقویم) باشد.
قالب ورودی، می‌تواند چندین بار استفاده شود. هر تاریخ/زمان به ترتیبی که داده شده است به تجزیه‌کننده‌های قالب ورودی ارسال می‌شود؛ اگر یک تاریخ/زمان با یک رشته مشخص‌کننده قالب ورودی داده‌شده با موفقیت خوانده شود، همان مقدار استفاده خواهد شد.
برای ورودی‌هایی با مشخصات ناکافی، از DT به عنوان مقدار پشتیبان برای پر کردن فیلدهای ناموجود استفاده می‌شود. همچنین برای مشخص‌کننده‌های قالب مبهم جهت تعیین موقعیت بازه آن‌ها در محور زمان مطلق استفاده می‌گردد. باید یک تاریخ/زمان در قالب ISO8601 باشد. در صورت حذف، مقدار پیش‌فرض تاریخ/زمان فعلی است.
فعال‌سازی تفسیر گریزهای ممیز وارونه (backslash escapes) در رشته‌های مشخص‌کننده قالب خروجی و ورودی.
تفسیر تاریخ‌ها در stdin یا خط فرمان به عنوان تاریخ‌های متعلق به محلی‌سازی LOCALE؛ این گزینه فقط بر نام ماه‌ها و روزهای هفته تأثیر می‌گذارد زیرا قالب‌های ورودی باید به طور صریح مشخص شوند.
تفسیر تاریخ‌ها در stdin یا خط فرمان به عنوان تاریخ‌های متعلق به منطقه زمانی ZONE.

مشخصات قالب‌بندی در dateutils مشابه ()strftime در استاندارد POSIX است.

با این حال، به دلیل پشتیبانی از طیف گسترده‌تری از گاه‌شمارها، dateutils باید قواعد متفاوتی را به کار گیرد.

مشخصات تاریخ:

%a  نام اختصاری روز هفته
%A  نام کامل روز هفته
%_a نام روز هفته کوتاه شده به یک نویسه (MTWRFAS)
%b  نام اختصاری ماه
%B  نام کامل ماه
%_b نام ماه کوتاه شده به یک نویسه (FGHJKMNQUVXZ)
%c  شمارش روز هفته در ماه (محدوده 00 تا 05)
%C  شمارش روز هفته در سال (محدوده 00 تا 53)
%d  روز ماه، ۲ رقمی (محدوده 00 تا 31)
%D  روز سال، ۳ رقمی (محدوده 000 تا 366)
%F  معادل %Y-%m-%d (قالب استاندارد ymd)
%g  سال تاریخ هفته ISO بدون قرن (محدوده 00 تا 99)
%G  سال تاریخ هفته ISO شامل قرن
%j  معادل %D
%m  ماه در گاه‌شمار فعلی (محدوده 00 تا 12)
%Q  فصل/سه‌ماهه سال (محدوده Q1 تا Q4)
%q  شماره سه‌ماهه (محدوده 01 تا 04)
%s  تعداد ثانیه‌ها از مبدأ زمان (Epoch)
%u  روز هفته به عدد (محدوده 01 تا 07، یکشنبه 07)
%U  شمارش هفته، روز اول هفته یکشنبه (محدوده 00 تا 53)
%V  شمارش هفته ISO، روز اول هفته دوشنبه (محدوده 01 تا 53)
%w  روز هفته به عدد (محدوده 00 تا 06، یکشنبه 00)
%W  شمارش هفته، روز اول هفته دوشنبه (محدوده 00 تا 53)
%y  سال بدون قرن (محدوده 00 تا 99)
%Y  سال شامل قرن
%_y سال کوتاه شده به یک رقم
%Z  اختلاف منطقه زمانی به ساعت و دقیقه (HH:MM) همراه با
    علامت پیشوند (+ برای اختلاف‌های شرق UTC، - برای اختلاف‌های
    غرب UTC)
%Od روز به اعداد رومی
%Om ماه به اعداد رومی
%Oy سال دو رقمی به اعداد رومی
%OY سال شامل قرن به اعداد رومی
%rs در سامانه‌های زمانی با مبدأ زمانی متفاوت از مبدأ یونیکس، این مشخصه
    تعداد ثانیه‌ها از آن مبدأ را مشخص می‌کند.
%rY در گاه‌شمارهایی که سال آن‌ها با سال‌های میلادی همزمان نیست،
    این مشخصه سال گاه‌شمار را انتخاب می‌کند.
%dth  روز ماه به عنوان یک عدد ترتیبی، 1st، 2nd، 3rd و غیره
%mth  ماه سال به عنوان یک عدد ترتیبی، 1st، 2nd، 3rd و غیره
%db روز کاری ماه (از آخرین روز کاری ماه قبل)
%dB تعداد روزهای کاری تا آخرین روز کاری این ماه

مشخصات زمان:

%H  ساعت در قالب ۲۴ ساعته، ۲ رقمی (محدوده 00 تا 23)
%I  ساعت در قالب ۱۲ ساعته، ۲ رقمی (محدوده 01 تا 12)
%M  دقیقه (محدوده 00 تا 59)
%N  نانوثانیه (محدوده 000000000 تا 999999999)
%p  رشته AM یا PM، ظهر PM و نیمه‌شب AM است
%P  مانند %p اما با حروف کوچک
%S  ثانیه (محدوده 00 تا 60، 60 برای ثانیه‌های کبیسه است)
%T  معادل %H:%M:%S

مشخصات عمومی:

%n  نویسه خط جدید
%t  نویسه تب
%%  نویسه لفظی %

تغییردهنده‌ها:

%O  تغییردهنده برای تبدیل اعداد ده‌دهی به اعداد رومی
%r  تغییردهنده برای تبدیل واحدها به واحدهای واقعی
%0  تغییردهنده برای فعال کردن پیشوندهای صفر
%SPC  تغییردهنده برای فعال کردن پیشوندهای فاصله
%-  تغییردهنده برای غیرفعال کردن کامل پیشوندها
th  پسوند، خواندن و چاپ اعداد ترتیبی
b   پسوند، در نظر گرفتن روزها به عنوان روزهای کاری

بر اساس طراحی، تاریخ‌های قبل از 1601-01-01 پشتیبانی نمی‌شوند.

برای تطابق، در اینجا فهرستی از شناسه‌های گاه‌شمار و رشته‌های قالب متناظر با آن‌ها آورده شده است:

ymd     %Y-%m-%d
ymcw    %Y-%m-%c-%w
ywd     %rY-W%V-%u
bizda   %Y-%m-%db
lilian     n/a
ldn        n/a
julian     n/a
jdn        n/a
matlab     n/a
mdn        n/a

این شناسه‌ها می‌توانند به عنوان رشته قالب خروجی استفاده شوند؛ افزون بر این، @code{lilian}/@code{ldn} و @code{julian}/@code{jdn} می‌توانند به عنوان رشته قالب ورودی نیز به کار روند.

برخلاف زمان یا لحظه‌های مطلق، بازه‌های زمانی بدون مرجع هستند، یعنی لحظه مرجع بخشی از بازه زمانی نیست. در نتیجه بازه‌های زمانی را نمی‌توان نام‌گذاری کرد، یعنی هیچ طرح نام‌گذاری که به طور بدون ابهام بر تمام بازه‌های زمانی و تمام مراجع اعمال شود وجود ندارد.

در نتیجه، هیچ‌یک از مشخص‌کننده‌های قالب برای تاریخ/زمان به معنای لغوی برای بازه‌های زمانی کاربردی ندارند. با این حال، برای کمک به استفاده شهودی، ما مشخص‌کننده‌های قالب را هنگامی که نشان‌دهنده مقادیر عدد صحیح و یک واحد معتبر برای بازه زمانی باشند، به شرح زیر بازاستفاده کرده‌ایم:

مشخصات تاریخ:

%c  معادل %w
%d  بازه زمانی به روز
%F  معادل %dd بدون رجوع به واحدهای بزرگ‌تر
%m  بازه زمانی به ماه
%w  بازه زمانی به هفته
%y  معادل %Y
%Y  بازه زمانی به سال
%db بازه زمانی به روزهای کاری
%dB معادل %db

مشخصات زمان:

%H  بازه زمانی به ساعت
%I  معادل %H
%M  بازه زمانی به دقیقه
%S  بازه زمانی به ثانیه
%T  معادل %Ss بدون رجوع به واحدهای بزرگ‌تر
%rS بازه زمانی به ثانیه‌های واقعی، شامل ثانیه‌های کبیسه
%rT معادل %rSs بدون رجوع به واحدهای بزرگ‌تر

مشخصات عمومی:

%n  نویسه خط جدید
%t  نویسه تب
%%  نویسه لفظی %

تغییردهنده‌ها:

%r    تغییردهنده برای تبدیل واحدها به واحدهای واقعی
%0    تغییردهنده برای پر کردن مقادیر پالایش‌شده با صفر
%SPC  تغییردهنده برای پر کردن مقادیر پالایش‌شده با فاصله
b     پسوند، در نظر گرفتن روزها به عنوان روزهای کاری

بازه‌های زمانی در هنگام نمایش از طریق مشخص‌کننده‌های قالب تا حدی مبهم هستند. برخلاف مشخص‌کننده‌های قالب در نمایش نقطه‌ای در زمان، مشخص‌کننده‌های بازه زمانی می‌توانند یک رابطه درون‌خطی داشته باشند.

بنابراین برای نمونه، یک بازه زمانی ۱۲۸ ثانیه‌ای ممکن است از طریق "%S" به عنوان "128" نمایش داده شود، اما به همین ترتیب از طریق "%M:%S" به صورت "02:08" (دو دقیقه و ۸ ثانیه خوانده می‌شود) ارائه گردد.

چندین رویکرد برای برخورد با این ابهام وجود دارد. ابزار datediff از آنچه ما «قاعده پالایش» می‌نامیم پیروی می‌کند. بدین معنا که صرف‌نظر از موقعیت یک مشخص‌کننده قالب، اگر یک /پالایش/ معتبر از مشخص‌کننده دیگری در رشته قالب باشد، آنگاه تنها مقدار کسری را نشان می‌دهد، یعنی مقدار در محدوده طبیعی خود نسبت به مشخص‌کننده /پالایش‌شده/.

%Y  پالایش‌های ممکن: %m, %w, %d
%m  پالایش‌های ممکن: %w, %d
%w  پالایش‌های ممکن: %d
%d  پالایش‌های ممکن: %H, %M, %S
%H  پالایش‌های ممکن: %M, %S
%M  پالایش‌های ممکن: %S

گزینه‌های پالایش به ترتیب تقدم فهرست شده‌اند و مانعةالجمع هستند. به این معنی که امکان بیان یک بازه زمانی بر حسب ماه و ساعت بدون داشتن مشخص‌کننده "%d" نیز وجود ندارد. از سوی دیگر در زنجیره‌ای از پالایش‌ها، عناصر درونی اختیاری هستند؛ به این معنی که می‌توانید یک بازه زمانی را بر حسب هفته و ساعت بیان کنید زیرا هر روز ۲۴ ساعت دارد و بنابراین ۱۶۸ ساعت در یک هفته وجود دارد.

در صورت بازه‌های زمانی منفی (مفروق‌منه در آینده نسبت به مفروق قرار دارد)، تنها بزرگ‌ترین واحد علامت منفی را خواهد داشت.

استفاده از قاعده پالایش، رشته قالب را کاملاً ساده نگه می‌دارد؛ نیازی به عملگرها یا یک زبان تمام‌عیار برای تمایز ابهام محدوده وجود ندارد، که در آن صورت به دلیل اینکه ممکن بود در تئوری بخشی از نویسه‌های لفظی رشته قالب باشند باید اسکیپ می‌شدند، و این امر اغلب منجر به خط فرمان‌هایی می‌شد که ایجاد آن‌ها دشوار و درک آن‌ها در آینده سخت‌تر بود (مثلاً اگر در اسکریپت‌های شل استفاده می‌شدند).

قاعده پالایش به شکل هوشمندانه‌ای ۹۹٪ موارد را پوشش می‌دهد، اما برخلاف سایر رویکردها، هیچ راهی برای نمایش دو مقدار پالایش‌نشده در یک رشته قالب یکسان وجود ندارد، مانند "'%w weeks (which is %d days)'".

$ datediff 2012-03-02 2012-03-02
0
$
$ datediff 2012-03-02 2012-03-12
10
$
$ datediff 2012-03-02 2012-04-12
41
$
$ datediff 2012-03-12 2012-04-02
21
$
$ datediff 2012-04-02 2012-03-12
-21
$
$ datediff 2012-01-02 2012-02-29 -f '%dd'
58d
$
$ datediff 2012-01-02 2012-02-29 -f '%ww %dd'
8w 2d
$
$ datediff 10:00:00 10:00:00
0s
$
$ datediff 10:01:00 10:06:00
300s
$
$ datediff 10:06:00 10:01:00
-300s
$
$ datediff 10:01:00 11:03:10 -f '%S sec'
3730 sec
$
$ datediff 10:01:00 11:03:10 -f '%Mm %Ss'
62m 10s
$
$ datediff 10:01:00 11:03:10 -f '%H:%M:%S'
1:2:10
$
$ datediff 2012-03-02T10:04:00 2012-03-02T10:14:00
600s
$
$ datediff 2012-03-02T10:04:00 2012-03-02T10:14:00 -f '%M min'
10 min
$
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00
92580s
$
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%d days and %S seconds'
1 days and 6180 seconds
$

نوشته شده توسط Sebastian Freundt <freundt@fresse.org>

گزارش باگ‌ها به: https://github.com/hroptatyr/dateutils/issues

مستندات کامل برای datediff به عنوان یک راهنمای Texinfo نگهداری می‌شود. اگر برنامه‌های info و datediff به درستی روی سامانه شما نصب شده باشند، دستور

info (dateutils)datediff

باید دسترسی شما به راهنمای کامل را فراهم کند.

May 2024 dateutils 0.4.11