اضافه کردن تاریخ شمسی به ویندوز با Shamsi_XP

پشتیبانی نکردن ویندوز از تاریخ شمسی از آن مشکلات باستانی است که تا به حال هیچ راه‌حل معقولی برای آن ارائه نشده است. البته اگر هدف فقط نمایش تاریخ شمسی در ویندوز باشد، از انواع نرم‌افزارهای نمایش تاریخ و تقویم شمسی مثل MPcalendar می‌توان استفاده نمود. اما در صورتی که بخواهیم تاریخ شمسی را به صورت سراسری و به شکلی که بوسیله توابع مربوطه مانند Date، Time، Now و … در ویندوز قابل دسترس باشد داشته باشیم، تنها راه معقول آن اضافه شدن نوع تقویم فارسی به استاندارد‌های قابل پشتیبانی توسط ویندوز در کتابخانه مربوط به Standards and Formats در Regional and Language options است. (که البته امری بعید به نظر می‌رسد)به عنوان مثال برای استفاده از تاریخ هجری قمری به شکل سراسری در ویندوز، می‌توانید با اجرای Regional and Language options از Control Panel به اولین Tab با نام Regional Options مراجعه کرده و در لیست Standards and Formats یکی از زبانهایی که تاریخ هجری دارد (مانند زبان اردو Urdu) را انتخاب و سپس با زدن دکمه Customize در بخش Date از لیست Calendar Type، تقویم “هجری” را انتخاب کنید. (تاریخ شمسی پشتیبانی نمی‌شود)

راه حلی که بنده از آن استفاده کردم، صرف نظر کردن از DateTimeStamp استاندارد (مشکل خاصی بوجود نخواهد آمد) و اضافه کردن رشته حاوی تاریخ شمسی به TimeStamp استاندارد بود. برای فعال بودن و بروز شدن خوردکار آن هم یک Hook Driver طراحی کردم که با تغییر زمان، به طور خودکار مقادیر فیلدهای 1159 و 2359 از LOCALE_SYSTEM_DEFAULT را آپدیت کند.
البته به دلیل محدودیت سایز متن TrayClock، از 4 رقم سال شمسی هم صرف نظر کردم (این مشکل قابل حل است) اما نتیجه کار تا حدودی قابل قبول است. مثلا با اجرای برنامه، ساعت ویندوز به این شکل تغییر می‌کند: (مثلا 4 شنبه 25 شهریور)

تاریخ شمسی برای ویندوز Shamsi date in winxp
همچنین بوسیله توابع Now و Time و … به راحتی می‌توان رشته تاریخ شمسی را جهت استفاده در زبانهای برنامه‌سازی استخراج نمود. البته توجه کنید که می‌بایست از انواع WideString یا UTFx استفاده شود.در هر صورت اگر هدف شما نمایش تاریخ شمسی در کنار ساعت ویندوز باشد، این ابزار راه‌حل مناسبی است.

تاریخ شمسی برای ویندوز Shamsi date in winxp

پیوست:

پس از بررسی برنامه، به دلیل وجود چند مشکل مربوط به عدم رسیدگی به Userdefined Messages (جهت اطلاع بیشتر به مبحث “Messages and Message Queues” در MSDN مراجعه کنید) و همینطور خطا در محاسبه تاریخ شمسی، درایور برنامه را بازنویسی نمودم.
در همین راستا از مقاله مفید جناب آقای موسی اکرمی با عنوان “Iranian calendar from historical backgrounds to up-to-date computations” ارائه شده در ICHS2005 که در حل مشکل تاثیرگذار بود متشکرم.

فایل جدید برنامه، نسخه 0.2 پیوست شده است. پس از رفع چند مشکل و بهینه‌سازی آنها، سورس برنامه نیز پیوست می‌گردد.

همچنین در پاسخ به آقای نصیری:
کاربرد فعلی این نرم‌افزار، دریافت تاریخ شمسی جاری (همان روز) به صورت سراسری (در سیستم عامل) بوسیله توابع با خروجی LongTimeFormat و ذخیره آن به صورتی غیر از DateTime است. در صفحات Detail, Properties و غیره، تاریخ به فرمت Double ذخیره شده بوده و برای نمایش Recode می‌گردد که به همین دلیل در همان زمان تاریخ شمسی جاری به آن پیوست می‌شود. در مورد فرمت نمایش تاریخ هم، محدودیت 14 کاراکتر یونیکد در فیلد مربوطه وجود دارد.

دریافت برنامه تاریخ شمسی 0.2 ShamsiXP

About محمد شمس

برنامه‌نویس، طراح انیمیشن و علاقمند به هوش مصنوعی

10 Comments

  1. سلام
    من از این تقویم استفاده کردم اما در اکسل مثلا برای تابع today همچنان تاریخ میلادی رو نشون می ده
    ممنون می شم اگه راهنماییم کنید

  2. سلام
    بسیار جالب است. با تشکر.
    لطفا سورس آن‌را هم قرار دهید تا از این نوع حرکت‌ها بیشتر شود 😉

  3. “ناشناس ۱”

    ۱٫ از تمام توابعی که خروجی خود را به صورت LongTimeFormat بدهند، به درستی می‌توان استفاده کرد. جهت اطمینان در برنامه Notepad کلید F5 را بزنید.

  4. “جناب آقای وحید نصیری”

    چشم در برنامه‌نویس قرار می‌دهم. امیدوارم.

  5. گزارش باگ:
    – به خواص یک فایل مراجعه کنید. تاریخ ایجاد و تغییر و غیره را به تاریخ امروز می‌زند (حتی اگر فایل بسیار قدیمی باشد)
    – در اکسپلورر ویندوز، در ستون date modified ، تمام تاریخ‌ها به امروز تنظیم شده در حالیکه نباید به این صورت باشد.

  6. “وحید نصیری”
    خیر فعلا باگ نیست، چرا که من از دو فیلد ۱۱۵۹ و ۲۳۵۹ (همان AM/PM) برای درج تاریخ استفاده کرده‌ام و به همین دلیل در هر جای سیستم که زمان جاری به فرمت LongTimeFormat و با فرمت DateTime (و نه String) نمایش داده شود، به جای فیلد AM/PM تاریخ شمسی دیده میشود. البته جای نگرانی نیست چرا که این تغییر، باعث هیچ ناهماهنگی در سیستم نمیشود و فقط در هنگام نمایش به این صورت دیده شده و در صورت ذخیره سازی به فرمت DateTime، ذخیره نمی‌شود. (فقط در زمانی که زمان جاری را به صورت String درون محتوی فایل ذخیره کنیم، تاریخ شمسی ذخیره می‌گردد. مثلا در logfile ها و یا توسط خود کاربر، در مابقی موارد، xp تاریخ را به صورت string ذخیره نمی‌کند)
    البته دلیل بنده برای اینکار، این بوده که تنها روش نمایش سراسری تاریخ شمسی بدون دستکاری در زمان و تاریخ جاری سیستم، همین است (در واقع یک Trick ساده است) چرا که فیلدهای AM/PM به عنوان جزئی از تاریخ سیستم ذخیره نشده و به صورت optional در زمان نمایش، از فیلدهایLOCALE_SYSTEM_DEFAULT خوانده می‌شوند.
    ،،، فعلا در حال بررسی روشی جهت معرفی کتابخانه مربوطه به شکل استاندارد در Calendar Types هستم.

  7. سلام
    در مورد زمان جاری مشکلی نیست. لطفا تصاویر زیر را بررسی کنید:
    http://kimag.es/share/42342958.png
    http://kimag.es/share/52667966.png

  8. + پیشنهاد:
    لطفا امکان انتخاب فرمت نمایش تاریخ را به کاربر بدهید:
    مثلا
    ۳۱ شهریور ۸۸
    ۸۸/۶/۳۱
    سه شنبه ۳۱ شهریور ۸۸
    س ۳۱ شهریور ۸۸
    و …

    با تشکر

  9. آیا روی ویندوز هفت میشه نصبش کرد؟

  10. بررسی نکردم.
    در صورت امکان شما امتحان کنید و نتیجه را به من هم اطلاع دهید.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


9 × = 9