Dateutils عبارة عن مجموعة من الأدوات التي تدور حول التلاعب بالتواريخ والأوقات في سطر الأوامر مع التركيز القوي على حالات الاستخدام التي تنشأ عند التعامل مع كميات كبيرة من البيانات المالية.
تتم استضافة Dateutils بشكل أساسي على github:
صفحة جيثب: https://github.com/hroptatyr/dateutils
الصفحة الرئيسية للمشروع: http://www.fresse.org/dateutils/
التنزيلات: https://bitbucket.org/hroptatyr/dateutils/downloads
فيما يلي قائمة قصيرة من الأمثلة التي توضح ما يمكن أن تفعله أدوات البيانات، للحصول على المواصفات الكاملة، راجع صفحات المعلومات والدليل. للحصول على تعليمات التثبيت، راجع ملف التثبيت.
أوامر Dateutils مسبوقة date
ولكنها تشبه أوامر يونكس المعروفة لأسباب بديهية. الاستثناء الوحيد هو strptime
الذي يشبه الدالة libc التي تحمل الاسم نفسه.
strptime
إصدار سطر الأوامر للوظيفة C
dateadd
إضافة فترات إلى التواريخ أو الأوقات
dateconv
تحويل التواريخ أو الأوقات بين التقويمات
datediff
حساب المدد بين التواريخ أو الأوقات
dategrep
تواريخ أو أوقات Grep في تدفقات الإدخال
dateround
تقريب التواريخ أو الأوقات إلى قيم "أكمل".
dateseq
إنشاء تسلسلات من التواريخ أو الأوقات
فرز datesort
فرز زمنيا.
datetest
قارن التواريخ أو الأوقات
datezone
تحويل التاريخ/الأوقات إلى مناطق زمنية بكميات كبيرة
أحب كل شيء موضح بالقدوة للحصول على الانطباع الأول. إذن هنا يأتي.
أداة تحاكي seq(1) ولكن مدخلاتها من مجال التواريخ بدلاً من الأعداد الصحيحة. عادةً ما تستخدم البرامج النصية شيئًا مثل
$ for i in $(seq 0 9); do date -d "2010-01-01 +${i} days" "+%F" done
والتي يمكن الآن اختصارها إلى
$ dateseq 2010-01-01 2010-01-10
مع ميزة إضافية تتمثل في أنه يمكن تقديم تاريخ الانتهاء مباشرةً بدلاً من حسابه من تاريخ البدء وفاصل زمني بالأيام. كما أنه يوفر ميزات محددة للتاريخ والتي من شأنها أن تكون بمثابة بيتا للتنفيذ باستخدام نهج seq(1)/date(1) أعلاه، مثل تخطي بعض أيام الأسبوع:
$ dateseq 2010-01-01 2010-01-10 --skip sat,sun => 2010-01-01 2010-01-04 2010-01-05 2010-01-06 2010-01-07 2010-01-08
يعمل Dateseq أيضًا في الأوقات:
$ dateseq 12:00:00 5m 12:17:00 => 12:00:00 12:05:00 12:10:00 12:15:00
وأيضًا أوقات التاريخ:
$ dateseq --compute-from-last 2012-01-02T12:00:00 5m 2012-01-02T12:17:00 => 2012-01-02T12:02:00 2012-01-02T12:07:00 2012-01-02T12:12:00 2012-01-02T12:17:00
أداة لتحويل التواريخ بين أنظمة التقويم المختلفة و/أو المناطق الزمنية. في حين أن هذه الأدوات الأخرى تركز عادةً على تحويل التواريخ الميلادية إلى التقويم الصيني، على سبيل المثال، فإن dconv يهدف إلى دعم أنظمة التقويم التي تعتبر ضرورية في السياقات المالية.
لتحويل التاريخ (الميلادي) إلى ما يسمى بتمثيل ymcw:
$ dateconv 2012-03-04 -f "%Y-%m-%c-%w" => 2012-03-01-00
والعكس صحيح:
$ dateconv 2012-03-01-Sun -i "%Y-%m-%c-%a" -f '%F' => 2012-03-04
حيث يعني تمثيل ymcw، %c
-th %w
من الشهر في سنة معينة. يعد هذا مفيدًا إذا تم تحديد تواريخ مثل الخميس الثالث من شهر مايو على سبيل المثال.
يمكن أيضًا استخدام dateconv لتحويل تكرارات التواريخ أو الأوقات أو أوقات التاريخ في دفق الإدخال أثناء التنقل
$ dateconv -S -i '%b/%d %Y at %I:%M %P' <<EOF Remember we meet on Mar/03 2012 at 02:30 pm EOF => Remember we meet on 2012-03-03T14:30:00
والأهم من ذلك التحويل بين المناطق الزمنية:
$ dateconv --from-zone "America/Chicago" --zone "Asia/Tokyo" 2012-01-04T09:33:00 => 2012-01-05T00:33:00 $ dateconv --zone "America/Chicago" now -f "%d %b %Y %T" => 05 Apr 2012 11:11:57
أداة لإجراء مقارنة التاريخ في الصدفة، تم تصميمها على غرار test(1)
ولكن مع خيارات سطر الأوامر المناسبة.
$ if datetest today --gt 2010-01-01; then echo "yes" fi => yes
أداة لإجراء حساب التاريخ (حسابات التاريخ) في الصدفة. بالنظر إلى التاريخ وقائمة المدد، سيتم حساب التواريخ الجديدة. بالنظر إلى المدة وقائمة التواريخ، سيحسب هذا التواريخ الجديدة.
$ dateadd 2010-02-02 +4d => 2010-02-06 $ dateadd 2010-02-02 +1w => 2010-02-09 $ dateadd -1d <<EOF 2001-01-05 2001-01-01 EOF => 2001-01-04 2000-12-31
إضافة المدد إلى الأوقات:
$ dateadd 12:05:00 +10m => 12:15:00
وحتى التاريخ والأوقات:
$ dateadd 2012-03-12T12:05:00 -1d4h => 2012-03-11T08:05:00
إذا كانت مدعومة من قاعدة بيانات Zoneinfo الخاصة بالنظام، فمن الممكن إجراء حسابات معدلة بالثواني الكبيسة. استخدم الوحدة rs
للإشارة إلى الثواني "الحقيقية":
$ dateadd '2012-06-30 23:59:30' +30rs => 2012-06-30T23:59:60
على عكس:
$ dateadd '2012-06-30 23:59:30' +30s => 2012-07-01T00:00:00
أداة لحساب الفرق بين تاريخين (أو أكثر). هذا هو إلى حد ما عكس أبي. ستكون المخرجات عبارة عن فترات تعطي التاريخ الثاني عند إضافتها إلى التاريخ الأول.
معرفة عدد الأيام بين تاريخين:
$ datediff 2001-02-08 2001-03-02 => 22
يمكن التحكم في تنسيق المدة من خلال المفتاح -f
:
$ datediff 2001-02-08 2001-03-09 -f "%m month and %d day" => 1 month and 1 day
يقبل datediff أيضًا الطوابع الزمنية كمدخل:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 => 92580s
يقوم المفتاح -f
بفعل الشيء الصحيح:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Ss' => 1d 6180s
قارن بـ:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Hh %Ss' => 1d 1h 2580s
إذا كانت مدعومة من قاعدة بيانات Zoneinfo الخاصة بالنظام، فيمكن إجراء حسابات معدلة بالثواني الكبيسة. استخدم محدد التنسيق %rS
للحصول على الوقت المنقضي بالثواني "الحقيقية":
datediff '2012-06-30 23:59:30' '2012-07-01 00:00:30' -f '%rS' => 61
أداة لاستخراج الخطوط من تدفق الإدخال الذي يطابق معايير معينة، مع إظهار الخط أو المطابقة:
$ dategrep '<2012-03-01' <<EOF Feb 2012-02-28 Feb 2012-02-29 leap day Mar 2012-03-01 Mar 2012-03-02 EOF => Feb 2012-02-28 Feb 2012-02-29 leap day
أداة "لتقريب" التواريخ أو الطوابع الزمنية إلى نقطة زمنية متكررة، مثل شهر يناير التالي/السابق أو الخميس التالي/السابق.
التقريب (للخلف) إلى الأول من الشهر الحالي:
$ dateround '2011-08-22' -1 => 2011-08-01
ابحث عن يوم الاثنين التالي من التاريخ الحالي (اليوم هو 2016-01-08):
$ dateround today Mon => 2015-01-11
ارجع إلى سبتمبر الماضي، ثم تقريب إلى نهاية الشهر:
$ dateround today -- -Sep +31d => 2015-09-30
قم بتقريب سلسلة من التواريخ بدقة إلى الأول من الشهر التالي:
$ dateround -S -n 1 <<EOF pay cable 2012-02-28 pay gas 2012-02-29 pay rent 2012-03-01 redeem loan 2012-03-02 EOF => pay cable 2012-03-01 pay gas 2012-03-01 pay rent 2012-04-01 redeem loan 2012-04-01
قم بتقريب التسلسل الزمني إلى الدقيقة التالية (أي جزء الثواني هو 00) ثم إلى نصف الوقت التالي (وتحويله إلى ISO):
$ dateround -S 0s30m -i '%d/%m/%Y %T' -f '%F %T' <<EOF 06/03/2012 14:27:12 eventA 06/03/2012 14:29:59 eventA 06/03/2012 14:30:00 eventB 06/03/2012 14:30:01 eventB EOF => 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventB 2012-03-06 15:30:00 eventB
وبدلاً من ذلك، إذا قمت بتقسيم اليوم إلى نصف ساعة، فيمكنك تقريبه إلى أحد الأشخاص الذين يستخدمون تدوين الفصل المشترك:
$ dateround -S /30m -i '%d/%m/%Y %T' -f '%F %T' <<EOF 06/03/2012 14:27:12 eventA 06/03/2012 14:29:59 eventA 06/03/2012 14:30:00 eventB 06/03/2012 14:30:01 eventB EOF => 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventB 2012-03-06 15:00:00 eventB
وهذا مطابق إلى حد كبير للمثال السابق فيما عدا أن الساعة الكاملة (التي تكون مضاعفًا لنصف ساعة) هي هدف تقريب محتمل.
أداة لجلب سطور الملف إلى الترتيب الزمني.
في الوقت الحالي، تعتمد أداة datesort
على sort(1)
مع دعم الحقول، على وجه الخصوص -t
لتحديد فاصل و- -k
للفرز حسب حقل معين.
$ datesort <<EOF 2009-06-03 caev="DVCA" secu="VOD" exch="XLON" xdte="2009-06-03" nett/GBX="5.2" 2011-11-16 caev="DVCA" secu="VOD" exch="XLON" xdte="2011-11-16" nett/GBX="3.05" 2013-11-20 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-11-20" nett/GBX="3.53" 2012-06-06 caev="DVCA" secu="VOD" exch="XLON" xdte="2012-06-06" nett/GBX="6.47" 2013-06-12 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-06-12" nett/GBX="6.92" 2010-11-17 caev="DVCA" secu="VOD" exch="XLON" xdte="2010-11-17" nett/GBX="2.85" EOF => 2009-06-03 caev="DVCA" secu="VOD" exch="XLON" xdte="2009-06-03" nett/GBX="5.2" 2010-11-17 caev="DVCA" secu="VOD" exch="XLON" xdte="2010-11-17" nett/GBX="2.85" 2011-11-16 caev="DVCA" secu="VOD" exch="XLON" xdte="2011-11-16" nett/GBX="3.05" 2012-06-06 caev="DVCA" secu="VOD" exch="XLON" xdte="2012-06-06" nett/GBX="6.47" 2013-06-12 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-06-12" nett/GBX="6.92" 2013-11-20 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-11-20" nett/GBX="3.53"
أداة لفحص قيم التاريخ/الوقت بسرعة في مناطق زمنية مختلفة. ستكون النتيجة مصفوفة تعرض كل قيمة تاريخ/وقت في كل منطقة زمنية:
$ datezone Europe/Berlin Australia/Sydney now 2014-06-30T05:00:00 => 2014-01-30T17:37:13+01:00 Europe/Berlin 2014-01-31T03:37:13+11:00 Australia/Sydney 2014-06-30T07:00:00+02:00 Europe/Berlin 2014-06-30T15:00:00+10:00 Australia/Sydney
يمكن أيضًا استخدام أداة datezone
للحصول على انتقال التوقيت الصيفي التالي أو السابق بالنسبة إلى تاريخ/وقت محدد:
$ datezone --next Europe/Berlin Australia/Sydney 2013-02-19 => 2013-03-31T02:00:00+01:00 -> 2013-03-31T03:00:00+02:00 Europe/Berlin 2013-04-07T03:00:00+11:00 -> 2013-04-07T02:00:00+10:00 Australia/Sydney
حيث يشير الطابع الزمني الأيسر إلى إزاحة المنطقة الحالية والجانب الأيمن هو إزاحة المنطقة بعد الانتقال. يشير التاريخ/الوقت إلى اللحظة المحددة التي يكون فيها الانتقال على وشك الحدوث.
في جوهره، تعتبر datezone
zdump(8)
أفضل.
أداة تجلب مرونة strptime(3)
إلى سطر الأوامر. في حين أن (على الأقل GNU) date(1)
لديه دعم لتنسيقات الإخراج، فإنه يفتقر إلى أي نوع من الدعم لقراءة المدخلات التعسفية من مجال التواريخ، لا سيما عندما يكون تنسيق الإدخال معروفًا مسبقًا على وجه التحديد ويجب أن تكون التواريخ/الأوقات المطابقة فقط يعتبر.
باستخدام أداة strptime
التي تقرأ التواريخ الغريبة مثل Mon, May-01/2000
تصبح مسألة
strptime -i "%a, %b-%d/%Y" "Mon, May-01/2000" => 2000-05-01
تمامًا كما كنت ستفعل في C.
لاحظ أن strptime
يستخدم بالفعل روتين strptime الخاص بالنظام libc، ولإخراج روتين strftime الخاص بالنظام. وبالتالي فإن معدّلات الإدخال والإخراج ستختلف بين الأنظمة.
للحصول على مجموعة محلل/طابعة محمولة، استخدم dateconv
كما هو موضح أعلاه. محددات تنسيق الإدخال والإخراج الخاصة بها مستقلة عن وقت تشغيل C.
في أي ترتيب معين ودون أي ادعاء بالكمال:
dateexpr: http://www.eskimo.com/~scs/src/#dateexpr
بيانات allanfalloon: https://github.com/alanfalloon/dateutils
نعم http://yest.sourceforge.net/
pdd https://github.com/jarun/pdd
استخدم الخيار الذي يناسب غرضك. وفي حالة إعجابك بصفحتي، قم بالتصويت: صفحة dateutils' openhub