بهترین و ساده ترین روش برای استفاده از تاریخ شمسی !

kern

Member
سلام.
بهترین و ساده ترین روش برای نگه داری تاریخ چیه؟! بصورت رشته ای ذخیره کنم؟! یا تبدیل کنم به میلادی بعد ذخیره کنم؟! یا روش دیگه ای هم هست؟!
.
تاریخ و ساعت رو حتما باید دقیق ذخیره کنم، همچنین روی این تاریخ یکسری محاسبات ممکنه بعدها انجام بشه.
.
مثلا امروز داده ای توی بانک ذخیره شده که بعداً نیاز هست که بدونیم این داده ی وارد شده چه مدت پیش در سیستم وارد شده است؟!
.
لطفاً راهنمایی کنید.
 

the_king

مدیرکل انجمن
سلام.
بهترین و ساده ترین روش برای نگه داری تاریخ چیه؟! بصورت رشته ای ذخیره کنم؟! یا تبدیل کنم به میلادی بعد ذخیره کنم؟! یا روش دیگه ای هم هست؟!
.
تاریخ و ساعت رو حتما باید دقیق ذخیره کنم، همچنین روی این تاریخ یکسری محاسبات ممکنه بعدها انجام بشه.
.
مثلا امروز داده ای توی بانک ذخیره شده که بعداً نیاز هست که بدونیم این داده ی وارد شده چه مدت پیش در سیستم وارد شده است؟!
.
لطفاً راهنمایی کنید.
بهترین و ساده ترین روش به کوئری هایی که روشون اجرا می کنید و کاربردی که براتون دارند بستگی داره. ممکنه یکجا رشته "24-06-1391" مناسب تر باشه
و یکجا اعداد صحیح 13910624 و یکجا DateTime و تقویم میلادی.

از نظر تعدادی، روش های ذخیره سازی تاریخ خیلی زیاد و متنوع اند. در انتخاب روش و فرمت داده ای که انتخاب می کنید هم کاربرد مهمه و هم حجم تراکنش ها و محاسبات
و هم ملاکی که برای شما اهمیت بیشتری داره. همیشه سادگی و یا سرعت ملاک نیست، بعضی اوقات سعی می کنند
فرمت ای رو بکار ببرند که تفسیر اش و یا دستکاری کردنش سخت باشه تا امنیت تاریخ هایی که ثبت می کنند بالاتر بره. ممکنه برای کاربردی
لازم بشه که تاریخ رو هم به شمسی/میلادی و هم قمری در دو فیلد جداگانه ذخیره کنید، چون الحمدا.. تقویم قمری مون با هیچ فرمولی جواب قطعی نمیده.
ممکنه تعداد رکورد ها اونقدر زیاد باشه که برای تشخیص رکورد های روز "جمعه" یک فیلد مجزا برای ثبت کردن "روز در هفته" در نظر بگیرید.

برای مثال هایی که شما زدید، پیشنهاد می کنم که از خود فرمت تاریخ بانک اطلاعاتی (DateTime در SQL Server) استفاده بکنید، کاملا مناسبه.
مادامی که نخواهید تاریخ شمسی رو نمایش بدید و یا ثبت نکنید نیازی به تبدیل تاریخ نیست. یعنی برای پیدا کردن رکورد هایی که تا 10 روز قبل
ایجاد شده اند و یا پیدا کردن اختلاف زمانی شون با الان نیازی به تبدیل کردن شون از میلادی به شمسی نیست. روز 86400000 میلی ثانیه است،
چه شمسی و چه میلادی. شما زمانی تاریخ شمسی لازم تون میشه که محاسبه تون به ماه و سال ربط پیدا کنه. فرضا بخواهید بدانید تا آخر ماه
چند روز مونده و یا بخواهید بدانید این رکورد مربوط به امسال ئه یا پارسال.
 

kern

Member
در انتخاب روش و فرمت داده ای که انتخاب می کنید هم کاربرد مهمه و هم حجم تراکنش ها و محاسبات
و هم ملاکی که برای شما اهمیت بیشتری داره. همیشه سادگی و یا سرعت ملاک نیست، بعضی اوقات سعی می کنند
فرمت ای رو بکار ببرند که تفسیر اش و یا دستکاری کردنش سخت باشه تا امنیت تاریخ هایی که ثبت می کنند بالاتر بره.
امنیت که فعلا ملاک نیست. تراکنش ها هم خیلی کم هستن.
تنها چیزی که الان برام مهمه اینه که بتونم خیلی راحت روی تاریخ های ذخیره شده محاسبات شمسی انجام بدم.


شما زمانی تاریخ شمسی لازم تون میشه که محاسبه تون به ماه و سال ربط پیدا کنه. فرضا بخواهید بدانید تا آخر ماه
چند روز مونده و یا بخواهید بدانید این رکورد مربوط به امسال ئه یا پارسال.
دقیقا به همین ماه و سال ربط پیدا میکنه. برای مثال میخوام کالاهای فروخته شده در یک بازه که کاربر انتخاب میکنه رو نشون بدم. (مثلاً: از 15 فروردین تا 29 اردیبهشت) در ضمن، مسلماً کاربر ترجیح میده تاریخ مورد نظرش رو از نرم افزار بصورت شمسی انتخاب کنه.
حالا این تاریخ رو چه جوری ذخیره کنم؟!


الان با استفاده از PersianCalendar موجود در Globalization تاریخ روز رو به شمسی بدست آوردم. نوع داده رو هم date انتخاب کردم که دیگه ساعت رو درج نکنه.

(در واقع چیزی که نیاز دارم اینه که کاربر توسط ابزاری بازه (از تاریخ... تا تاریخ...) رو انتخاب کنه و داده هایی که مربوط به اون تاریخ هستند، نمایش داده بشه.);


در حاشیه:
ابزار شمسی DateTimePicker تو خود ویژوال استودیو هست؟! از کجا میتونم اضافه ش کنم؟
در ضمن نوع داده اش تو بانک باید چی باشه؟!
 

the_king

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



دقیقا به همین ماه و سال ربط پیدا میکنه. برای مثال میخوام کالاهای فروخته شده در یک بازه که کاربر انتخاب میکنه رو نشون بدم. (مثلاً: از 15 فروردین تا 29 اردیبهشت) در ضمن، مسلماً کاربر ترجیح میده تاریخ مورد نظرش رو از نرم افزار بصورت شمسی انتخاب کنه.
حالا این تاریخ رو چه جوری ذخیره کنم؟!


الان با استفاده از PersianCalendar موجود در Globalization تاریخ روز رو به شمسی بدست آوردم. نوع داده رو هم date انتخاب کردم که دیگه ساعت رو درج نکنه.

(در واقع چیزی که نیاز دارم اینه که کاربر توسط ابزاری بازه (از تاریخ... تا تاریخ...) رو انتخاب کنه و داده هایی که مربوط به اون تاریخ هستند، نمایش داده بشه.);


در حاشیه:
ابزار شمسی DateTimePicker تو خود ویژوال استودیو هست؟! از کجا میتونم اضافه ش کنم؟
در ضمن نوع داده اش تو بانک باید چی باشه؟!

همون DateTime مناسبه.
شما دو تا تاریخ d1 و d2 رو که منظور بازه تاریخ از d1 الی d2 هست رو بصورت شمسی در DateTime می کنید و بعد بر اساس شون کوئری رو اجرا می کنید.
برای نمایش تاریخ و تبدیل تقویم رجوع شود به :

تبدیل تاریخ شمسی - میلادی در #c

برای کنترل مناسب رجوع شود به :

نحوه استفاده از تاریخ شمسی در c#
 

kern

Member
همون DateTime مناسبه.
شما دو تا تاریخ d1 و d2 رو که منظور بازه تاریخ از d1 الی d2 هست رو بصورت شمسی در DateTime می کنید و بعد بر اساس شون کوئری رو اجرا می کنید.
DateTime ساعت رو هم تو بانک ذخیره میکنه!!!! بعداً تو کوئری ها گیر نکنم؟! :shock:

برای نمایش تاریخ و تبدیل تقویم رجوع شود به :

تبدیل تاریخ شمسی - میلادی در #c

خیلی عالی بود! ممنون.

اینا رو چه جوری باید استفاده کنم. وقتی sln پروژه رو باز میکنم کلی خط Error میاد... ؟!
 

the_king

مدیرکل انجمن
DateTime ساعت رو هم تو بانک ذخیره میکنه!!!! بعداً تو کوئری ها گیر نکنم؟! :shock:
اگه تاریخ رو از جایی بخوانید که ساعت همراهش باشه (مثلا DateTime.Now) حتما اون ساعت روی کوئری ها تاثیر میذاره. چون فرضا d1 = d2 نمیشه چون
یکی شون یه ثانیه جلوتر ئه. DateTime یه مشخصه به نام Date داره که ساعت رو حذف می کنه و فقط تاریخ رو تحویل میده، مثلا d1.Date که اگه ساعت تو کوئری هاتون
ملاک نیست با اضافه کردن Date. به اسم متغیر نادیده اش بگیرید و به Date تبدیلش کنید.

DateTime
اینا رو چه جوری باید استفاده کنم. وقتی sln پروژه رو باز میکنم کلی خط Error میاد... ؟!
فایل رو از حالت zip شده خارج کنید، توی پوشه PersianDate\bin\Debug چهار تا فایل هست که لازمشون دارید.

یه فرم تو پروژه خودتون باز کنید تا در حالت ویرایش ظاهر فرم باشه. توی پنجره Toolbox که کنترل ها برای قرار دادن روی فرم هست زبانه General رو که پایین تر از بقیه است باز کنید.
در فضای خالی اش راست کلیک کنید و گزینه ...Choose Items رو انتخاب کنید. صبر کنید تا ویژوال استدیو از کما در بیاد و پنجره Choose Toolbox Items نشون داده بشه.
در زبانه NET Framework Components. دکمه Browse رو فشار دهید و مسیر اون پوشه رو بدهید و یکبار فایل PersianDate.dll و دفعه بعدی PopupControl.dll رو انتخاب کنید و Open کنید
تا به پروژه و Toolbox اضافه بشه. وقتی پنجره Choose Toolbox Items رو ببندید توی Toolbox کنترل ها اضافه شده.
 

kern

Member
اگه تاریخ رو از جایی بخوانید که ساعت همراهش باشه (مثلا DateTime.Now) حتما اون ساعت روی کوئری ها تاثیر میذاره. چون فرضا d1 = d2 نمیشه چون
یکی شون یه ثانیه جلوتر ئه. DateTime یه مشخصه به نام Date داره که ساعت رو حذف می کنه و فقط تاریخ رو تحویل میده، مثلا d1.Date که اگه ساعت تو کوئری هاتون
ملاک نیست با اضافه کردن Date. به اسم متغیر نادیده اش بگیرید و به Date تبدیلش کنید.


فایل رو از حالت zip شده خارج کنید، توی پوشه PersianDate\bin\Debug چهار تا فایل هست که لازمشون دارید.

یه فرم تو پروژه خودتون باز کنید تا در حالت ویرایش ظاهر فرم باشه. توی پنجره Toolbox که کنترل ها برای قرار دادن روی فرم هست زبانه General رو که پایین تر از بقیه است باز کنید.
در فضای خالی اش راست کلیک کنید و گزینه ...Choose Items رو انتخاب کنید. صبر کنید تا ویژوال استدیو از کما در بیاد و پنجره Choose Toolbox Items نشون داده بشه.
در زبانه NET Framework Components. دکمه Browse رو فشار دهید و مسیر اون پوشه رو بدهید و یکبار فایل PersianDate.dll و دفعه بعدی PopupControl.dll رو انتخاب کنید و Open کنید
تا به پروژه و Toolbox اضافه بشه. وقتی پنجره Choose Toolbox Items رو ببندید توی Toolbox کنترل ها اضافه شده.

ممنون.
کارم رو راه میندازه...
ولی اگه میشد خود کامپوننت DateTimePicker ویژوال استودیو رو شمسی کرد خیلی بهتر بود...
در ضمن چه جوری میتونم تاریخ رو مستقیم شمسی ذخیره کنم؟!
این کامپوننت میلادی ذخیره میکنه. دیگه تو کوئری ها نمیخوام تبدیل داشته باشم...
 

the_king

مدیرکل انجمن
ممنون.
کارم رو راه میندازه...
ولی اگه میشد خود کامپوننت DateTimePicker ویژوال استودیو رو شمسی کرد خیلی بهتر بود...
در ضمن چه جوری میتونم تاریخ رو مستقیم شمسی ذخیره کنم؟!
این کامپوننت میلادی ذخیره میکنه. دیگه تو کوئری ها نمیخوام تبدیل داشته باشم...

تو لینک هایی که دادم قبلا اشاره کرده ام که DateTime مستقل از تقویم ئه. اینکه بصورت پیشفرض تاریخ رو میلادی نشون میده یا دریافت می کنه ربطی به
مقداری که ثبت می کنه نداره. وقتی شما تاریخ رو ثبت می کنید عملا بصورت یک عدد که کسری از ثانیه است ثبت میشه. یک تاریخ مشخصی رو مبدا
قرار دادن و از اون لحظه به بعد رو با کسری از ثانیه محاسبه می کنند.
نمیشه بگید من تاریخ رو شمسی ذخیره کرده ام یا میلادی. شما تاریخ رو با هر تقویمی که خواستید نشون می دهید یا ویرایش می کنید، اما این ارتباطی
با مقداری که ثبت میشه نداره.
 

جدیدترین ارسال ها

بالا