VahidN/DNTPersianUtils.Core

خروجی تاریخ میلادی پس از تبدیل

KAJOOSH opened this issue · 5 comments

یک پروژه با Net 8 به همراه فریم ورک DNTPersianUtils انجام شده است و برای یک مشتری پس از تبدیل تاریخ به شمسی تاریخ همچنان میلادی خروجی داده می شود و من نتوانستم مشکل را پیدا و حل کنم. ممنون می شوم راهنمایی نمایید.
نوع داده datetime می باشد.
ویندوز 2019 و 2022 برای همان مجموعه مشتری تست شد. و مشکل یکسان بود.
زمانی که fromDocDate.ToUniversalTime() و پس از ان تبدیل صورت میگیرد . خروجی شمسی می شود اما تاریخ ها اشتباه است.

  • تاریخ و ساعت سرور کاملا درست می باشد.

به چه صورتي استفاده كرديد؟ تبديل سراسري هست؟ يك مثال بزنيد.

فرض کنید یک فرم ساده دارید که یک input تاریخ دارد و پس از submit تاریخ اشتباه است.

public class HomeController : Controller
{
    public HomeController()
    {
    }

    public IActionResult Index(DateTime? test)
    {
        var d1 = test?.ToShortPersianDateString(); // result = 2024/03/02
        var d2 = DateTime.Now.ToShortPersianDateString(); // result = 1402/12/12
        var d3 = test?.ToUniversalTime().ToShortPersianDateString(); // result = 1402/12/01

        return View();
    }
}

بنده هیچگونه تنظیم سراسری انجام ندادم ! خیلی عجیب است و تنها یک مشتری از 10 ها مشتری اینجوری سیستم واکنش می دهد !
فقط در صورتی که پارامتر از کلاینت به سرور ارسال شود اینگونه میشود. ( تاریخ پارامتر به میلادی هم کاملا درست به سرور پاس داده میشود )

تاريخ را بايد با فرمت iso 8601 به سمت سرور ارسال كنيد تا مشكل پردازشي نداشته باشد؛ به اين صورت.

تاريخ را بايد با فرمت iso 8601 به سمت سرور ارسال كنيد تا مشكل پردازشي نداشته باشد؛ به اين صورت.

ورودی input از نوع text میباشد مثلا "02-03-2024" هستش ! کنترل تاریخ نمیاشد.

همانطور كه عنوان شد، اين فرمت بي‌معنا هست و توسط ASP.NET Core و زيرساخت آن، بر اساس تنظيمات لوكال سيستم و مرورگر، تفسيرهاي متفاوتي را به همراه دارد. به همين جهت بايد از فرمت ISO استفاده كنيد.
اين فرمت‌ها براي Web API در NET Core. بي‌معنا هستند:
yyyyMMdd
yyyy-MM-dd
MM-dd-yyyy
yyyyMMddTHHmmss
yyyy-MM-ddTHH-mm-ss

در كل مساله‌اي را كه مطرح كرديد، مشكل اين كتابخانه نيست. مشكل فرمت دريافت اطلاعات شما در يك اكشن متد هست.
راه ساده‌تر اين است كه اين اطلاعات را به همين صورت، به‌شكل رشته‌اي دريافت كنيد و اگر حتما نياز است به DateTime تبديل شود، خودتان با استفاده از متد DateTime.TryParseExact دقيقا فرمت سفارشي خودتان را مشخص و Parse كنيد و يا حتي يك ModelBinder سفارشي براي آن درست كنيد يا يك تبديلگر براي آن درست كنيد.