PDA

View Full Version : سوال: بهترین شیوه برای دریافت تاریخ و زمان از کاربر چیست ؟ و معرفی یک Dll کامل و مناسب ؟



royabahrami76
پنج شنبه 19 مرداد 1396, 18:25 عصر
سلام در حال کار کردن روی پروژه ای هستم که در قسمت های مختلف از امکانات خود سایت گرفته تا پنل کاربری و پنل مدیریت بارها و بارها از کاربر تاریخ را دریافت میکنیم .



همونطور که میدونید در تبدیل تاریخ شمسی به میلادی به خاطر اختلاف در تعداد روز تقویمی (یک روز اختلاف) در تبدیل تاریخ ها مشکل ایجاد میشود و همینطور در تبدیل زمان .



و واضح تربخوام توضیح بدم اگه تاریخ و زمان رو بصورت شمسی از کاربر بگیرم و در پایگاه داده ذخیره کنیم دربازخوانی ممکن است(دراختلاف زمانی یک سال) تاریخ یک روز تغییر کند و ساعت هم طبیعتا همیشه تغییر میکند.



برای تبدیل تاریخ به میلادی و بلعکس و یا تاریخ بصورت نمایش روزِهفته و به صورت رشته ای و ... من از Dll زیر استفاده میکنم :

PersianDateTime.dll
که قابلیت هایی مثل موارد زیر را دارد (البته خیلی بیشتر از این):
http://s9.picofile.com/file/8303134042/Dll.png


مورد خیلی مهم زمانی است که تاریخ و زمان باید با هم دریافت شوند و در یک فیلد ذخیره شوند .


سوالات :
1 - در جاهایی که با تاریخ و زمان سروکار داریم (ثبت تاریخ جاری سیستم یا دریافت از کاربر) بنظرتون بهتره که قبل ذخیره در جدول اون رو به میلادی تبدیل کرده و بعدا در زمان بازخوانی و نمایش اون رو دوباره به Persian تبدیل کنیم ؟ این شیوه بنظرتون صحیح است ؟





2 - بهترین شیوه برای ذخیره تاریخ و زمان(بصورت کامل) در پایگاه داده چیست ؟
بنظرتون تاریخ و زمان رو در دو فیلد جدا از هم در دیتابیس درنظر بگیرم و تاریخ و زمان رو جدا در اون ها ذخیره کنم و یا استفاده از یک فیلد فقط datetime بهتر است ؟




3 -برای دریافت تاریخ و زمان از کاربر بصورت دریافت سال و ماه و روز و زمان در TextBox های جدا چه پیشهادی رو دارید؟
نظرم الان اینه که برای هرکدوم یک TextBox بگذارم و در سمت اکشن بصورت پارامتر دریافت کردن سپس بصورت زیر میشه اون رو بصورت یک datetime کامل درآورد :
http://s9.picofile.com/file/8303139850/ToMiladi.jpg

مهدی کرامتی
پنج شنبه 19 مرداد 1396, 19:31 عصر
اگر در پروژه تان با تاریخ میلادی کار ندارید بهترین روش این است که Culture برنامه را توسط فایل PersianCulture (ضمیمه شده است) به شمسی تغییر دهید. در این حالت تمام تاریخ های برنامه هنگام نمایش شمسی است، اما به صورت خودکار در دیتابیس میلادی دیده می شود، البته به واسطه فعال بودن PersianCalendar در سمت برنامه، تمام محاسبات فاصله 2 تاریخ با هم با مبنای تاریخ شمسی محاسبه می شود (مثلا فاصله 1396/6/1 تا 1396/7/1 را 31 رو برخواهد گرداند).

نحوه فعال سازی تقویم شمسی نیز در کل برنامه با افزودن دستورات زیر به رویداد Application_BeginRequest در Global.asax به شکل زیر می باشد:
protected void Application_BeginRequest(object sender, EventArgs e)
{
var persianCulture = new PersianCulture();
Thread.CurrentThread.CurrentCulture = persianCulture;
Thread.CurrentThread.CurrentUICulture = persianCulture;
}
با رعایت پروسه فوق، شما می توانید در TextBox هایی که مرتبط به یک فیلد تاریخ است بدون مشکل تاریخ شمسی وارد کنید و نگران هیچ چیز نباشید.
برای افزودن DatePicker به TextBox های مذکور نیز می توانید از پلاگین های jQuery (مانند این: http://babakhani.github.io/PersianWebToolkit/doc/datepicker/0.4.5/demo.html) استفاده کنید.

royabahrami76
پنج شنبه 19 مرداد 1396, 20:45 عصر
اگر در پروژه تان با تاریخ میلادی کار ندارید بهترین روش این است که Culture برنامه را توسط فایل PersianCulture (ضمیمه شده است) به شمسی تغییر دهید. در این حالت تمام تاریخ های برنامه هنگام نمایش شمسی است، اما به صورت خودکار در دیتابیس میلادی دیده می شود، البته به واسطه فعال بودن PersianCalendar در سمت برنامه، تمام محاسبات فاصله 2 تاریخ با هم با مبنای تاریخ شمسی محاسبه می شود (مثلا فاصله 1396/6/1 تا 1396/7/1 را 31 رو برخواهد گرداند).

نحوه فعال سازی تقویم شمسی نیز در کل برنامه با افزودن دستورات زیر به رویداد Application_BeginRequest در Global.asax به شکل زیر می باشد:
protected void Application_BeginRequest(object sender, EventArgs e)
{
var persianCulture = new PersianCulture();
Thread.CurrentThread.CurrentCulture = persianCulture;
Thread.CurrentThread.CurrentUICulture = persianCulture;
}
با رعایت پروسه فوق، شما می توانید در TextBox هایی که مرتبط به یک فیلد تاریخ است بدون مشکل تاریخ شمسی وارد کنید و نگران هیچ چیز نباشید.
برای افزودن DatePicker به TextBox های مذکور نیز می توانید از پلاگین های jQuery (مانند این: http://babakhani.github.io/PersianWebToolkit/doc/datepicker/0.4.5/demo.html) استفاده کنید.

ممنونم از پاسختون
این DatePicker رو چطوری دانلود کنم ؟ لین دانلود ؟

مهدی کرامتی
پنج شنبه 19 مرداد 1396, 21:03 عصر
https://github.com/babakhani/pwt.datepicker/archive/master.zip

royabahrami76
جمعه 20 مرداد 1396, 16:47 عصر
https://github.com/babakhani/pwt.datepicker/archive/master.zip

متاسفانه یک اختلاف ساعتی هنوز هم وجود داره :

http://s9.picofile.com/file/8303210734/convert.jpg
http://s8.picofile.com/file/8303210234/convert.jpg

علت این مورد چیه ؟

مهدی کرامتی
جمعه 20 مرداد 1396, 18:37 عصر
با چه کدی چنین اختلافی رو اندازه گرفتید؟

mr.sirwan
سه شنبه 11 مهر 1396, 21:57 عصر
با سلام بنده از این کلاس و datepicker ی که جناب کرامتی معرفی کردن استفاده میکنم، و خیلی عالی برای نمایش تاریخ ها کار میکنه، منتهی موقع ویرایش رکورد، وقتی که تاریخ از سمت دیتابیس واکشی میشه و میاد توی فیلد مربوطه میشینه، مقدار نمایشیش به یک تاریخ عجیب (حتی بعضی وقتا به سال منفی) تبدیل میشه، ممنون میشم در این مورد بنده رو راهنمایی کنین. اینم نمونه

146579
146580
وقتی که کد های مربوط به این کلاس رو داخل متد Application_BeginRequest کامنت میکنم، این مشکل برطرف میشه و تاریخ موقع ویرایش به درستی نمایش داده میشه

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

ویرایش1:
از این کد برای دیتپیکر استفاده میکنم:

<script type="text/javascript">
$(document).ready(function () {
$("#AbsentDate").persianDatepicker({
observer: true,
format: 'YYYY/MM/DD'
});
});
</script>

moslem.hady
چهارشنبه 12 مهر 1396, 06:58 صبح
با سلام بنده از این کلاس و datepicker ی که جناب کرامتی معرفی کردن استفاده میکنم، و خیلی عالی برای نمایش تاریخ ها کار میکنه، منتهی موقع ویرایش رکورد، وقتی که تاریخ از سمت دیتابیس واکشی میشه و میاد توی فیلد مربوطه میشینه، مقدار نمایشیش به یک تاریخ عجیب تبدیل میشه، ممنون میشم در این مورد بنده رو راهنمایی کنین. اینم نمونه

جالب اینجاس که با هر بار رفرش صفحه ویرایش، مقدار تاریخ تغییر میکنه و با سه بار رفرش، فیلد تاریخ به تاریخ امروز مقدار میگیره
فکر میکنم این بخاطر این باشه که اون تقویمی که استفاده کردید (bootstrap datepicker یا pwt.datepicker) اگه تاریخ ورودیش که توی تکست باکس هست شمسی باشه، خراب میکنه. باید تاریخ ورودی میلادی باشه و بعد خودش شمسی میکنه.

mr.sirwan
چهارشنبه 12 مهر 1396, 10:43 صبح
فکر میکنم این بخاطر این باشه که اون تقویمی که استفاده کردید (bootstrap datepicker یا pwt.datepicker) اگه تاریخ ورودیش که توی تکست باکس هست شمسی باشه، خراب میکنه. باید تاریخ ورودی میلادی باشه و بعد خودش شمسی میکنه.

درسته به همین دلیله، ولی من تاریخ هارو بصورت میلادی توی دیتابیس ذخیره میکنم و با اون کلاس PersianCulture که جناب کرامتی معرفی کردن، موقع نمایش تاریخ ها این کلاس خودش میاد اون تاریخ های میلادی رو به شمسی تبدیل میکنه یعنی من نقشی تو اینکار ندارم، ایا راه حلی برای این هستش؟

مهدی کرامتی
چهارشنبه 12 مهر 1396, 10:52 صبح
اگر همه داده ها رو از طریق برنامه و هنگام فعال بودن PersianCulture ثبت شده باشد مشکلی پیش نمی آید.

mr.sirwan
چهارشنبه 12 مهر 1396, 11:10 صبح
اگر همه داده ها رو از طریق برنامه و هنگام فعال بودن PersianCulture ثبت شده باشد مشکلی پیش نمی آید.

همه داده ها از طریق برنامه و هنگام فعال بودن PersianCulture ثبت شده اند، هیچکدوم رو بصورت دستی توی دیتابیس درج نکردم و از همون اول و ابتدای شروع کار پروژه از این کلاس استفاده کردم، اما همونطور که قبلا اشاره کردم، وقتی تاریخ از دیتابیس واکشی میشه بصورت میلادی هستش، و کلاس PersianCulture اونرو بصورت شمسی نمایش میده و داخل تکست باکس قرار میگیره، چون pwt.datepicker فرض رو بر میلادی بودن تاریخ میذاره، پس اون تاریخ شمسی رو دوباره تبدیل میکنه و یه تاریخ دیگه رو بدست میاره

moslem.hady
چهارشنبه 12 مهر 1396, 11:29 صبح
اگه نمیتونید قبل از ارسال به تکست باکس تاریخ رو میلادی کنید، توی خود گیت از آقای باباخانی (دولوپر این تقویم) سوال کنید که آیا میشه تاریخ شمسی ورودی داد و چطور.
https://github.com/babakhani/pwt.datepicker/issues (https://github.com/babakhani/pwt.datepicker)

mr.sirwan
چهارشنبه 12 مهر 1396, 14:00 عصر
با سلام مجدد،مشکل تغییر مقدار تکست باکس با هر بار رفرش صفحه رو با اضافه کردن اتریبیوت
autocomplete="off"
به اینپوت حل کردم، ولی هنوزم یک بار تاریخ رو تبدیل میکنه

nasr
یک شنبه 14 دی 1399, 10:28 صبح
سلام جناب کرامتی
من از .net Core استفاده میکنم(البته اول کار هستم)
دو تا سوال دارم
اول اینکه ، بدون اینکه روش شما را پیاده کنم، تاریخ ها بصورت شمسی نمایش داده میشه یعنی توی دیتابیس میلادی است ولی توی نمایش شمسی
دلیلش چیه؟
دوم اینکه من ApplyFormatInEditMode = true را هم اضافه میکنم ولی در حالت ویرایش اصلا هیچ تاریخی در TextBox مربوطه نمایش داده نمیشه، نه میلادی و نه شمسی
ممنون میشم راهنماییم کنید

مهدی کرامتی
یک شنبه 14 دی 1399, 17:35 عصر
سلام جناب کرامتی
من از .net Core استفاده میکنم(البته اول کار هستم)
دو تا سوال دارم
اول اینکه ، بدون اینکه روش شما را پیاده کنم، تاریخ ها بصورت شمسی نمایش داده میشه یعنی توی دیتابیس میلادی است ولی توی نمایش شمسی
دلیلش چیه؟

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



دوم اینکه من ApplyFormatInEditMode = true را هم اضافه میکنم ولی در حالت ویرایش اصلا هیچ تاریخی در TextBox مربوطه نمایش داده نمیشه، نه میلادی و نه شمسی
ممنون میشم راهنماییم کنید
اگر TextBox مربوطه به درستی به یک فیلد DateTime از مدل Bind شده باشه مشکل حل میشه.

nasr
سه شنبه 16 دی 1399, 08:12 صبح
سلام.
اگر تاریخ ویندوزتون روی شمسی تنظیم شده باشد فقط روی سیستم عامل شما (نه دیگر سیستم ها، از جمله سرور سایت تون) تاریخ ها شمسی دیده میشه، اما اگر قرار باشه همه جا درست دیده بشه لازمه از کلاس فعال ساز تاریخ شمسی استفاده کنید.


اگر TextBox مربوطه به درستی به یک فیلد DateTime از مدل Bind شده باشه مشکل حل میشه.

سلام آقای کرامتی
راستش بعید میدونستم بعد از چند سال شما به این تاپیک جواب بدید و همین باعث خوشحالی بنده شد

میشه لطفا راهنمایی کنید با توجه به اینکه .net core جایی با عنوان Application_BeginRequest نداره، من چطور از این روشی که شما آموزش دادید استفاده کنم؟
ممنون

مهدی کرامتی
یک شنبه 21 دی 1399, 20:15 عصر
سلام آقای کرامتی
راستش بعید میدونستم بعد از چند سال شما به این تاپیک جواب بدید و همین باعث خوشحالی بنده شد

میشه لطفا راهنمایی کنید با توجه به اینکه .net core جایی با عنوان Application_BeginRequest نداره، من چطور از این روشی که شما آموزش دادید استفاده کنم؟
ممنون
یک کلاس برای انجام کاری که درخواست کردید در ASP.NET Core ضمیمه کردم. این کلاس، در همه ورژن های دات نت کور جواب میده.

برای فعال کردنش در ASP.NET Core، در ابتدای متد ConfigureServices در StartUp این خط رو اضافه کنید:

// Persian date to be added here.
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = PersianDateExtensionMethods.GetPersianCulture();

همین کلاس در آخرین ورژن Blazor و انواع دیگر پروژه های مبتنی بر دات نت کور هم جواب میده. بعنوان مثال، در پروژه های کنسول و ... که فایل لانچر اصلی شون Program.cs است همین دستور رو در ابتدای متد Main فرخوانی کنید.

البته، افزودن کلاس ضمیمه شده به پروژه های مقصد فراموش نشود.

nasr
سه شنبه 23 دی 1399, 09:16 صبح
یک کلاس برای انجام کاری که درخواست کردید در ASP.NET Core ضمیمه کردم. این کلاس، در همه ورژن های دات نت کور جواب میده.

برای فعال کردنش در ASP.NET Core، در ابتدای متد ConfigureServices در StartUp این خط رو اضافه کنید:

// Persian date to be added here.
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = PersianDateExtensionMethods.GetPersianCulture();

همین کلاس در آخرین ورژن Blazor و انواع دیگر پروژه های مبتنی بر دات نت کور هم جواب میده. بعنوان مثال، در پروژه های کنسول و ... که فایل لانچر اصلی شون Program.cs است همین دستور رو در ابتدای متد Main فرخوانی کنید.

البته، افزودن کلاس ضمیمه شده به پروژه های مقصد فراموش نشود.



سلام جناب کرامتی
واقعا تشکر میکنم از پاسخگویی شما
مشکل نمایش تاریخ شمسی در کل پروژه حل شد ولی الان مشکلی که دارم اینه که در حالت ویرایش، تاریخ به درستی نشون داده نمیشه
این قطعه کد مربوط به ویو در حالت Edit

<div class="form-group">
<label asp-for="NewsDate" class="control-label"></label>
<input asp-for="NewsDate" class="form-control" />
<span asp-validation-for="NewsDate" class="text-danger"></span>
</div>


این هم کد کلاس

[Display(Name = "تاریخ خبر")]
[Required(ErrorMessage = "لطفا {0} را وارد کنید")]
[DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
public System.DateTime NewsDate { get; set; }


جالبیش اینه که وقتی ApplyFormatInEditMode را true قرار میدم در زمان ویرایش تاریخ را خالی نشون میده و وقتی false میکنم تاریخ را در textbox نشون میده

با تشکر فراوان

nasr
سه شنبه 23 دی 1399, 10:16 صبح
با عرض سلام مجدد
مشکل بنده با اضافه کردن این قطعه کد به کلاس News حل شد "[DataType(DataType.Date)]"

فقط الان دوتا مشکل دارم
یکی اینکه زمانی که روی فیلد کلیک میکنم، هم datepicker شمسی را میاره و هم میلادی را
و مشکل دوم اینکه با کلیک روی datepicker شمسی فیلد تاریخ خالی میشه و فقط حروف yyyy/mm/dd را نشون میده
تصویر را ضمیمه کردم

ممنون

nasr
سه شنبه 14 بهمن 1399, 10:34 صبح
سلام
آیا روشی هم وجود داره که تمام اعداد نمایشی در سایت به فارسی تبدیل بشه

مهدی کرامتی
سه شنبه 14 بهمن 1399, 17:09 عصر
قابل انجام هست، اما توصیه نمیشود، چون اعداد ارزش عددی و محاسباتی شون رو از دست میدن.
بجاش بهتره از فونت ایران سنس استفاده کنید، یک ورژن از اون فونت بنام FaNums بصورت پیش فرض تمام اعداد ر فارسی نشون میده.