PDA

View Full Version : سوال: تبدیل تاریخ میلادی کامپیوتر به شمسی



aleas2
دوشنبه 12 اردیبهشت 1390, 01:03 صبح
سلام خسته نباشید کسی یه سورس تبدیل تاریخ میلادی کامپیوتر بگیر تبدیلش کنه به شمسی مثلا تو کامپیوتر این تاریخ میگیره 2011/02/09 بگیره تبدیلش کنه به شمسی چون برای اینکه تاریخ کامپیوتر نشون بدین تو vb6تا جایی من میدونم فقط یه تابع هسته اونم date که اونم فقط تاریخ میلادی نمایش میده یه سورس میخوام تاریخ از کامپیوتر بصورت شمسی تو vb6 نمایش بده البته خواهشا" با ساده ترین روش باشه کدهاش گنگ نباشه

Restlesa
دوشنبه 12 اردیبهشت 1390, 02:25 صبح
دوست عزیز منظورت اینه که تاریخ خوده کامپیوتر به شمسی تبدیل بشه یا اینکه تاریخ میلادی رو از ورودی بگیره و به شمسی تبدیل کنه ؟؟؟

M_Maskout
دوشنبه 12 اردیبهشت 1390, 09:42 صبح
...تو vb6تا جایی من میدونم فقط یه تابع هسته اونم date که اونم فقط تاریخ میلادی نمایش میده یه سورس میخوام تاریخ از کامپیوتر بصورت شمسی تو vb6 نمایش بده
سلام
ویژگی (property)‏ Calendar در VB می‌تونه دو مقدار شمارشی vbCalGreg و vbCalHijri رو به خودش بگیره. vbCalGreg با مقدار عددی 0، پیش فرض Calendar هست و باعث می‌شه، دستورات و توابع کار با تاریخ (مثل Date) تاریخ رو بصورت میلادی نشون بدند و vbCalHijri با مقدار عددی 1 باعث می‌شه این دستورات و توابع، تاریخ رو بصورت هجری قمری نشون بدند.
برای استفاده از Calendar، فقط کافیه یه بار مقدار اون رو در هرجای برنامه که خواستید، تغییر بدید. سالها قبل، شرکت برنا، که برای ویندوز 98، فارسی ساز تولید می‌کرد (و امروزه هم اغلب ما از فونت‌های فارسی ساخته شده‌ی همون شرکت با پیشوند B مثل B Titr، استفاده می‌کنیم)، فارسی سازی با نام پارسا 2001 برای ویندوزهای 98 و Me ارائه داد، که بعد از نصب اون، در صورت استفاده از عبارت Calendar = vbCalHijri تو برنامه‌های نوشته شده با VB، دیگه هیچ کاری لازم نبود انجام بشه و تمام توابع و دستورات کار با تاریخ، خود به خود، با تاریخ شمسی کار می‌کردند.
ولی در حال حاضر یکی از بهترین کارهایی که من تو این زمینه دیدم، یه DLL هست که برای شما ضمیمه می‌کنم. و اگه هدفتون فقط کار با تاریخ شمسی باشه (دنبال سورس مثلاً برای ارائه به جای خاصی نباشید)، این DLL تمام کارهای شما رو راه می‌اندازه.
با توجه به اینکه اون یه فایل مجانیه، لطفاً هرکی ازش استفاده کرد، روح اموات تولید کننده‌ش و بنده رو با ذکر صلوات، خوشحال کنه.



البته خواهشا" با ساده ترین روش باشه کدهاش گنگ نباشه
هر چند فایل ضمیمه، یه چیز خیلی جامع و مانع هست، ولی بازم شاید کد زیر یه جاهایی به درد بخوره:
(فقط خواهش می‌کنم دوستان حرفه‌ای به طریقه کد نویسی ایراد نگیرن، چون اون رو یه غیرحرفه‌ای (خودم)، سالها قبل نوشته).

Function FarsiDate(TarikhMiladi As String)
Dim DayNumber As Integer
Dim Kabiseh As Byte
Dim S As String
Dim Day, Month, Year As Integer
If TarikhMiladi = "" Then
TarikhMiladi = Format(Date$, "dd/MM/yyyy")
Else
TarikhMiladi = Format(TarikhMiladi, "dd/MM/yyyy")
End If
Day = Val(Left$(TarikhMiladi, 2))
Month = Val(Mid$(TarikhMiladi, 4, 2))
Year = Val(Mid$(TarikhMiladi, 7))
DayNumber = (Format(Date, "yyyy") - 622 Mod 1000) Mod 100
If (((Year Mod 1000) Mod 100) = DayNumber) Or _
(((Year Mod 1000) Mod 100) = DayNumber + 1) Then
Year = 1300 + ((Year Mod 1000) Mod 100)
FarsiDate = LTrim$(Str$(Year)) + "/" + LTrim$(Str$(Month)) + "/" + LTrim$(Str$(Day))
Exit Function
End If
If Year Mod 4 = 0 Then Kabiseh = 1 Else Kabiseh = 0
Select Case Month
Case 1: DayNumber = Day
Case 2: DayNumber = 31 + Day
Case 3: DayNumber = 31 + 28 + Kabiseh + Day
Case 4: DayNumber = 31 + 28 + Kabiseh + 31 + Day
Case 5: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + Day
Case 6: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + Day
Case 7: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + Day
Case 8: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + 31 + Day
Case 9: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + 31 + 31 + Day
Case 10: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + 31 + 31 + 30 + Day
Case 11: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + Day
Case 12: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + Day
End Select
Year = Year - 622
Month = Month + 9
If DayNumber > 79 Then
DayNumber = DayNumber - (79 - Kabiseh)
Year = Year + 1
Else
DayNumber = DayNumber + (286 + Kabiseh)
End If
If Month > 12 Then Month = Month - 11
If DayNumber <= 186 Then
Month = (DayNumber \ 31) + 1
If (DayNumber Mod 31) = 0 Then Month = Month - 1
Day = (DayNumber Mod 31)
If Day = 0 Then Day = 31
Else
Month = 7 + ((DayNumber - 186) \ 30)
If Month > 12 Then Month = 12
If ((DayNumber - 186) Mod 30) = 0 Then Month = Month - 1
Day = (DayNumber - 186) Mod 30
If Day = 0 Then Day = 30
End If
FarsiDate = LTrim$(Str$(Year)) + "/" + LTrim$(Str$(Month)) + "/" + LTrim$(Str$(Day))
End Function
ضمناً تو سطر 21، نحوه تشخیص کبیسه بودن سال میلادی، مشخص شده.

aleas2
دوشنبه 12 اردیبهشت 1390, 10:11 صبح
واقعا ممنون ولی راجب این کبیسه بودن مطمنی تقسیم برچهار باقیمانده صفر بود کبیسه هسته؟ضمنا" میشه یکم از روش کار این سورس بهم بگی؟چجوری میلادی رو به شمسی تبدیل میکنه؟

Restlesa
دوشنبه 12 اردیبهشت 1390, 11:39 صبح
دوست عزیز میشه نحوه فراخوانی این تابعی که نوشتی رو بگی ؟؟؟

aleas2
دوشنبه 12 اردیبهشت 1390, 12:32 عصر
دوست عزیزRestlesa (http://barnamenevis.org/member.php?144087-Restlesa) من میخوام تاریخ کامپیوتر به شمسی تبدیل کنه اخه تابعی ندیدم که تاریخ کامپیوتر به شمسی نمایش بده

این هم این دوست عزیز گفته من به این صورت ازش استفاده کردم که فراخوانی میشه




Private Sub Command1_Click()
Call FarsiDate
end sub

Function FarsiDate()
Dim DayNumber As Integer, TarikhMiladi As String
Dim Kabiseh As Byte
Dim S As String
Dim Day, Month, Year As Integer
If TarikhMiladi = "" Then
TarikhMiladi = Format(Date$, "dd/MM/yyyy")
Else
TarikhMiladi = Format(TarikhMiladi, "dd/MM/yyyy")
End If
Day = Val(Left$(TarikhMiladi, 2))
Month = Val(Mid$(TarikhMiladi, 4, 2))
Year = Val(Mid$(TarikhMiladi, 7))
DayNumber = (Format(Date, "yyyy") - 622 Mod 1000) Mod 100
If (((Year Mod 1000) Mod 100) = DayNumber) Or _
(((Year Mod 1000) Mod 100) = DayNumber + 1) Then
Year = 1300 + ((Year Mod 1000) Mod 100)
FarsiDate = LTrim$(Str$(Year)) + "/" + LTrim$(Str$(Month)) + "/" + LTrim$(Str$(Day))
Exit Function
End If
If Year Mod 4 = 0 Then Kabiseh = 1 Else Kabiseh = 0
Select Case Month
Case 1: DayNumber = Day
Case 2: DayNumber = 31 + Day
Case 3: DayNumber = 31 + 28 + Kabiseh + Day
Case 4: DayNumber = 31 + 28 + Kabiseh + 31 + Day
Case 5: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + Day
Case 6: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + Day
Case 7: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + Day
Case 8: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + 31 + Day
Case 9: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + 31 + 31 + Day
Case 10: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + 31 + 31 + 30 + Day
Case 11: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + Day
Case 12: DayNumber = 31 + 28 + Kabiseh + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + Day
End Select
Year = Year - 622
Month = Month + 9
If DayNumber > 79 Then
DayNumber = DayNumber - (79 - Kabiseh)
Year = Year + 1
Else
DayNumber = DayNumber + (286 + Kabiseh)
End If
If Month > 12 Then Month = Month - 11
If DayNumber <= 186 Then
Month = (DayNumber \ 31) + 1
If (DayNumber Mod 31) = 0 Then Month = Month - 1
Day = (DayNumber Mod 31)
If Day = 0 Then Day = 31
Else
Month = 7 + ((DayNumber - 186) \ 30)
If Month > 12 Then Month = 12
If ((DayNumber - 186) Mod 30) = 0 Then Month = Month - 1
Day = (DayNumber - 186) Mod 30
If Day = 0 Then Day = 30
End If
FarsiDate = LTrim$(Str$(Year)) + "/" + LTrim$(Str$(Month)) + "/" + LTrim$(Str$(Day))
Txt1 = FarsiDate
End Function





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

Restlesa
دوشنبه 12 اردیبهشت 1390, 12:59 عصر
بابت توضیحتون ممنونم
منم یه نمونه برات می زارم البته با اجازه دوست خوبمون M_Mackout
به سه روش می تونی تاریخ شمسی رو به نمایش دریباری و از لحاظ محاسبه سال کبیسه 100 درصد تضمین شده است و امتحانشم کردم
امیدوارم خوشت بیاد

aleas2
دوشنبه 12 اردیبهشت 1390, 13:05 عصر
واقعا ممنون حالا کسی میتونه بصورت متنی توضیح بده چجوری باید تاریخ میلادی رو به شمسی تبدیل کرد؟کسی میدونه؟که بهتر متوجه بشم کد نویسی بر چه اساسه؟

knight-rak
سه شنبه 13 اردیبهشت 1390, 01:06 صبح
برای منم جالب هستش که الگوریتم این تبدیل رو بدونم
خوش حال میشم دوستان توضیحات واضحی از این الگوریتم کلی بدن

موفق باشید ....

M_Maskout
چهارشنبه 14 اردیبهشت 1390, 01:42 صبح
... راجب این کبیسه بودن مطمنی تقسیم برچهار باقیمانده صفر بود کبیسه هسته؟...

سلام
من این تابع رو سال‌ها قبل با پاسکال نوشتم و بعداً فقط اونو به VB برگردون کردم. به همین جهت خیلی یادم نیست که توش چی کار کردم! :متعجب: برای تشخیص سال کبیسه همونطور که دوستان تو تاپیک تشخیص سال کبیسه (http://barnamenevis.org/showthread.php?285253-%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%D8%B3%D8%A7%D9%84-%DA%A9%D8%A8%DB%8C%D8%B3%D9%87)، اشاره کردن و البته صفحه مربوطه تو سایت ویکی پدیا که ali.rezaei7 (http://barnamenevis.org/member.php?130237-ali.rezaei7) عزیز اون رو معرفی کرده، راه‌های خاصی وجود داره. ولی این قضیه تقسیم بر 4، بر اساس محتویات همون صفحه (سایت ویکی پدیا) تا سال 2100 (نووووود سال دیگه)، درست کار می‌کنه. بنابراین شاید فعلاً نیاز به دستکاری و اضافه کردن کد برای این قسمت تابع نباشه.:چشمک:


...ضمنا" میشه یکم از روش کار این سورس بهم بگی؟چجوری میلادی رو به شمسی تبدیل میکنه؟

برای منم جالب هستش که الگوریتم این تبدیل رو بدونم
خوش حال میشم دوستان توضیحات واضحی از این الگوریتم کلی بدن
این تابع یه رشته به عنوان مقدار تاریخ میلادی ورودی دریافت می‌کنه و معادل شمسی اون رو برمی‌گردونه. فرقی هم نداره که تاریخ وارد شده، تاریخ فعلی سیستم باشه یا هر تاریخ دیگه‌ای. اگر هم رشته رو خالی بذارین، تابع مقدار تاریخ فعلی رو به تاریخ شمسی تبدیل می‌کنه.
تو سطر 6 خالی بودن رشته‌ی ورودی رو چک می‌کنه و در هر صورت اون رو به فرمت dd/MM/yyyy تبدیل می‌کنه. تبدیل فرمت، صرفاً به خاطر اینه که بتونه راجع به شماره ماه و شماره روز تو روزهای با شماره کمتر از 12 (حداکثر تعداد ماه‌ها) تصمیم بگیره (فرمت خروجی تابع Date، توی VB، بر اساس فرمت تنظیم شده تو ویندوز هست و ممکنه جای روز و ماه متفاوت باشه). سطرهای 11، 12 و 13 هم برای تبدیل شماره‌های روز، ماه و سال به مقدار عددی هست.
سطرهای 14 تا 20 برای این هست که در صورتیکه تاریخ ورودی به هر دلیل تاریخ شمسی بود، اون رو تشخیص بده و خودش رو برگردونه. این قسمت در زمانی که من این کد رو نوشتم توی برنامه‌ی خودم لازم بوده. ولی قاعدتاً شما نیازی به اون ندارین و می‌تویند حذفش کنید (برای صرفه جویی تو حافظه از متغیر DayNumber استفاده کردم و برای محاسبه شماره سال شمسی متغیر جدید درست نکردم).
سطر 14، اول سال جاری میلادی رو به دست می‌یاره (من اینجا از Format(Date, "yyyy")‎ استفاده کردم) و 622 رو از اون کم می‌کنه (مثلاً 1389=622-2011)، بعد باقیمانده‌ی اون رو به 1000 (مثلاً 389) و بعد هم به 100 (می‌شه 89) به دست میاره.حالا تو سطر 15 اگر سال تاریخ وارد شده برابر با عدد به دست اومده (89 یا 90) بود، نتیجه می‌گیره که تاریخ وارد شده یه تاریخ شمسیه و خود تاریخ وارد شده رو به عنوان خروجی برمی‌گردونه (تاکید می‌کنم این قسمت صرفاً برای برنامه‌ی خودم بوده و به خاطر بی‌توجهی تو این تاپیک اورده شده :خجالت:)
سطر 21 همونطور که گفتم برای تشخیص سال میلادی کبیسه (فقط سال میلادی و نه شمسی) هست.
سطرهای 22 تا 35 برای به دست اوردن تعداد روزهای سپری شده از روز اول سال میلادی هست. و عملاً شماره روز تاریخ مورد نظر تو سال رو برمی‌گردونه (مثلاً روز صدم سال). اینکار رو هم بر اساس ماه میلادی انجام می‌ده. اگه ماه، 1 باشه، فقط به تعداد روز همون ماه از شروع سال می‌گذره. اگه ماه 2 باشه به تعداد کل روزهای ماه 1 و تعداد روزهای گذشته از ماه 2، از شروع سال می‌گذره. اگه ماه 3 باشه، به تعداد مجموع روزهای ماه 1 و ماه 2 و روزهای گذشته از ماه 3 از شروع سال می‌گذره. البته در اینجا با توجه به اینکه تو تاریخ میلادی، اگر سالی کبیسه باشه، به ماه دوم سال یه روز اضافه می‌شه، از ماه سوم به بعد مقدار کبیسه هم به مجموع به دست اومده، اضافه می‌شه.
به همین ترتیب تا ماه 12 (علت اینکه کد رو اینجوری نوشتم : Kabiseh + Day + ‏28 + ‏31 فقط به دلیل ایجاد خوانایی برنامه‌س و برای افزایش سرعت محاسبات، بهتره مجموع اعداد نوشته بشه: Kabiseh + Day + ‏59).
سطر 36 معادل سال شمسی رو حساب می‌کنه.
سطرهای 37 و 44، کاملاً زائد هستن. :خجالت:
تو سطر 38 در صورتیکه شماره روز بدست اومده بیشتر از 79 باشه (اختلاف تعداد روز شروع سال میلادی با سال شمسی یعنی 11 دی تا 1 فروردین)، معنیش اینه که تاریخ میلادی مورد نظر بعد از اول فروردینه و باید به سال شمسی بدست اومده یه سال اضافه کرد. و ضمناً برای به دست آوردن شماره روز از سال شمسی باید 79 رو از شماره روز سال میلادی کم کرد (و البته با در نظر گرفتن یه روز اضافی در سال کبیسه‌ی میلادی). اما در صورتیکه روز بدست اومده، یکی از روزهای زمستون باشه (از 79 کمتر باشه)، 286 روز به اون اضافه می‌شه تا شماره اون روز تو سال شمسی بدست بیاد.
تو سطرهای باقیمونده (سطر 45 به بعد) هم، بر اساس شماره روز از سال شمسی، شماره‌ی ماه و روز از همون ماه رو بدست میاره. (با احتساب اینکه روز بدست اومده تو شش ماه اول سال هست یا شش ماه دوم سال)


دوست عزیز میشه نحوه فراخوانی این تابعی که نوشتی رو بگی ؟؟؟
برای تاریخ فعلی:

Dim S As String

S = FarsiDate(CStr(Date))
Debug.Print S

برای تاریخ‌های دیگه:

Debug.Print FarsiDate("2011/05/01")
...
ضمن عرض تشکر از دوستان که به این کد توجه کردن، بازم تأکید می‌کنم که من این کد رو سال‌ها قبل نوشتم و قطعاً ایرادهای زیادی به اون وارده.

R2du-soft
یک شنبه 08 تیر 1393, 05:54 صبح
بابت توضیحتون ممنونم
منم یه نمونه برات می زارم البته با اجازه دوست خوبمون M_Mackout
به سه روش می تونی تاریخ شمسی رو به نمایش دریباری و از لحاظ محاسبه سال کبیسه 100 درصد تضمین شده است و امتحانشم کردم
امیدوارم خوشت بیاد

دوستان در این کدی (http://barnamenevis.org/showthread.php?285251-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-%D8%A8%D9%87-%D8%B4%D9%85%D8%B3%DB%8C&p=1257122&viewfull=1#post1257122) که Restlesa (http://barnamenevis.org/member.php?144087-Restlesa) عزیز قرار دادن چطور میشه یک زمان رو مانند 2014/06/29 که در یک text1.text وارد شده رو به شمسی تبدیل کرد؟
من هرکاری کردم نشد فکر کنم به دلیل # در بین تاریخ هست!
کسی میتونه کمکم کنه؟


به نظر شما استفاده از کد پست شماره 3 (http://barnamenevis.org/showthread.php?285251-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-%D8%A8%D9%87-%D8%B4%D9%85%D8%B3%DB%8C&p=1256992&viewfull=1#post1256992) بهتر هست یا استفاده از پست شماره 7 (http://barnamenevis.org/showthread.php?285251-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-%D8%A8%D9%87-%D8%B4%D9%85%D8%B3%DB%8C&p=1257122&viewfull=1#post1257122)؟به چه دلیل؟

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




Private Sub Command1_Click()
On Error GoTo ero

Dim r As Date
r = Text1.Text
Label0.Caption = To_Hejri(r, 0)

Exit Sub
ero:
MsgBox "We Haven't This Date!"

End Sub



یک مشکلی دارم با کد موجود در پست شماره 3 لطفا راهنمایی کنید:
زمانی که با این کد تاریخ 2014/06/30 رو تبدیل میکنم به فارسی من تاریخ 1393/4/9 رو دریافت میکنم.
روش کار برنامه درسته اما میخوام ماه که عدد 4 رو داره به 04 و روز که عدد 9 رو داره به 09 تغییر کنه.
چیکار باید کنم؟
ممنون میشم کسی بلده راهنمایی کنه

ABRHeaven
چهارشنبه 10 تیر 1394, 22:26 عصر
این ورژن جدید DLL ای هست که تو پست قبل گذاشتم.
این DLL ای که نوشتم مبدل 5 تقویم شمسی، هجری، میلادی، جولین و عبری هست. کدهای این DLL از یه سایته معتبر که تو کاره تبدیل تاریخ هست گرفتم و به DLL تبدیلش کردم. به نظر من دقیق ترین کده. نحوه فراخوانی هم با یه مثال توضیح دادم.
یه تقویمم که از این DLL استفاده میکنه داخل فایله ضمیمه هست. همچنین یه مبدل تاریخ هم داخلش هست که مستقل کار میکنه اما از هموم کدهای DLL استفاده میکنه
اگه سورس DLL یا بقیه برنامه ها رو هم خواستید بهم خبر بدید.
http://s7.picofile.com/file/8252115518/DateCnv_ALOPCal_NewNew.zip.html