عنوان:

‫تنظیمات تاریخ قمری در ویندوز


نویسنده: وحید نصیری
تاریخ: ۱۳۹۵/۰۸/۱۸ ۱۹:۵
آدرس: www.dntips.ir
این قطعه کد را برای نمایش تاریخ امروز، به قمری درنظر بگیرید:
using System;
using System.Globalization;
 
namespace ArabicDate
{
    class Program
    {
        static void Main(string[] args)
        {
            var now = DateTime.Now;
            var date = now.ToString("d MMMM yyyy", new CultureInfo("ar-SA"));
            Console.WriteLine(date);
        }
    }
}
در قطعه کد فوق، d، روز را به عدد، MMMM، ماه را به حروف و yyyy، سال را به رقم نمایش می‌دهد (اطلاعات بیشتر) و انتخاب فرهنگ عربستان سعودی، سبب تبدیل این تاریخ به قمری خواهد شد. اگر بجای آن fa-IR را قرار دهیم، تاریخ میلادی سیستم را به شمسی تبدیل می‌کند و خروجی آن بر اساس فرهنگ ar-SA در امروز، بر روی سیستم من، چنین چیزی است:
9 صفر 1438

اگر به سایت http://time.ir مراجعه کنیم، امروز را «8 صفر» معرفی کرده‌است.

سؤال: مشکل کجاست؟ آیا پیاده سازی تاریخ قمری در دات نت مشکل دارد؟
پاسخ: این مساله مرتبط به دات نت فریم ورک نیست و به تنظیمات ویندوز بر می‌گردد:


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

نظرات

  • رحمت اله رضایی در ۱۳۹۵/۰۸/۱۹ ۰:۱۳
    چرا برای من (Windows 8.1) شمسی رو نشون نمیده :

    • وحید نصیری در ۱۳۹۵/۰۸/۱۹ ۱:۱۷
      CultureInfo وابسته‌است به تنظیمات سیستم عامل و تغییرات آن. این مورد بر روی ویندوز 10 اصلاح شده‌است.
       ^ Windows versions or service packs can change the available cultures

  • وحید نصیری در ۱۳۹۶/۰۱/۱۹ ۱۴:۷
    یک نکته‌ی تکمیلی
    برای اینکه تنظیمات ذکر شده در مورد تقویم قمری تاثیر داده شوند، تقویم انتخابی باید به صورت ذیل باشد:
    new CultureInfo("ar-SA") { DateTimeFormat = { Calendar = new HijriCalendar() } }
    • محسن جمشیدی در ۱۳۹۶/۱۰/۲۰ ۹:۹
      HijriCalendar پراپرتی ای دارد با نام HijriAdjustment که می‌توان مقدار آن را تنظیم کرد و در صورتیکه تنظیم نشود مقدار آن از تنظیمات ویندوز همانطور که بالا توضیح داده شده، خوانده می‌شود. 
      اما متاسفانه تقویم HijriCalendar و یا UmAlQuraCalendar  هیچ کدام با تقویم قمری ای که ما استفاده می‌کنیم مطابقت ندارد. من حتی NodaTime رو هم بررسی کردم اما به نتیجه مطلوب نرسیدم.
      آیا کسی در این زمینه تجربه ای داره که تقویم قمری ای که ما استفاده می‌کنیم از چه روش محاسباتی ای استفاده می‌کند و آیا کتابخانه ای در این زمینه وجود دارد؟
      • وحید نصیری در ۱۳۹۷/۰۶/۰۹ ۱۵:۳۰
        امکان تبدیل تاریخ شمسی و میلادی به قمری، مستقل از تنظیمات ویندوز، به کتابخانه‌ی «DNTPersianUtils.Core » اضافه شد. روش استفاده:
        // تبدیل تاریخ میلادی به قمری 
        new DateTime(2018, 08, 31).ToIslamicDay() -> new IslamicDay(1439, 12, 19)
        
        // تبدیل تاریخ شمسی به قمری 
        IslamicDateUtils.PersianDayToIslamicDay(1397, 6, 9) -> new IslamicDay(1439, 12, 19)
        • محمد جواد نیکان در ۱۴۰۴/۱۱/۰۴ ۱۰:۰۳
          سلام و احترام
          در تبدیل از میلادی به قمری، یک روز اختلاف وجود دارد در صورتی که در تبدیل از شمسی به قمری صحیح است
          ورژن استفاده شده 6.7.2.0
          در ویندوز 10 و نوع تقویم هجری شمسی
  • مسعود رحمانی در ۱۳۹۹/۰۳/۱۷ ۱۵:۴
    من به طور کلی به کمک HijriCalendar.HijriAdjustment = -1 اکثرا تبدیل‌ها رو به درستی میتونم انتخاب کنم. اما در بعضی موارد روش شما و یا استفاده از  HijriCalendar در بعضی ماه‌ها با مشکل مواجه میشود. اگر تاسوعا و عاشورا را با time.ir مقایسه اختلاف یک روز این مورد میشوید. به طور مثال:
    var now = Convert.ToDateTime("2020-08-29"); 
    var date = now.ToString("d MMMM yyyy", new CultureInfo("ar-SA")); 
    Console.WriteLine(date);
    آیا راهکاری برای تشخیص -1 یا -2 سراغ دارید؟