صفحه اصلیدرباره ماخدماتفن آوري هانمونه كارهامشتریانمقالاتتماس با ما
 
 
گروه نرم افزاري وبيليكس > مقالات > تبديل تاريخ ميلادي به شمسي در VB .NET
تبديل تاريخ ميلادي به شمسي در VB .NET


Change EDate to PDate (VB .NET)

در نسخه هاي جديد سيستم عامل ويندوز بسياري از مشكلات برنامه نويسان در ارتباط با ايجاد نرم افزارهاي فارسي به لطف امكانات جديد اين سيستم عامل و از جمله پشتيباني از UTF-8 برطرف شده است و برنامه نويسان ديگر مجبور به نوشتن كدهاي طولاني و خسته كننده براي ايجاد كامپوننتهاي فارسي (از جمله ويرايشگر متن) كه غالبا با اشكالاتي نيز همراه بودند نيستند، در اين نسخه ها (بخصوص در Windows XP) و با استفاده از زبانهاي برنامه نويسي .NET ميتوان به راحتي با بررسي نصب شدن زبان فارسي در بين زبانهاي نصب شده بر روي سيستم، در هر مورد كه لازم باشد با چند خط برنامه ساده ورودي كيبورد را به زبان فارسي تغيير داد و مديريت تايپ را به ويندوز سپرد، همچنين بسياري از كامپوننتهاي موجود قابليت استفاده در حالت RTL (براي زبانهايي كه از راست به چپ نوشته مي شوند، بخصوص زبان فارسي) را دارا ميباشند كه خود باعث راحت تر شدن كار برنامه نويسان شده است.

با تمام آنچه گفته شد، هنوز يك مشكل ديگر در اين زبانهاي برنامه نويسي (و شايد هم سيستم عامل ويندوز) وجود دارد و آن هم عدم پشتيباني از تاريخ شمسي ميباشد كه در بسياري از برنامه ها ميتواند به نوعي باعث ايجاد دردسر براي برنامه نويس شود. اين مشكل در زبان برنامه نويسي VB .NET نيز موجود ميباشد كه با استفاده از تابع هايي كه در ادامه اين مقاله معرفي خواهند شد قابل رفع ميباشد. تابع اصلي تبديل تاريخ ميلادي به شمسي كه در ادامه به آن پرداخته شده است در واقع از الگوريتمي كه در يك تابع ديگر كه به همين منظور و براي زبان برنامه نويسي PHP نوشته شده است، استفاده مينمايد.

متن اصلي توابع نوشته شده براي اين كار به صورت زير ميباشد:

 

Private DT_arrPDayInMonth(11) As Integer
Private DT_arrEDayInMonth(11) As Integer

Public Structure DT_DateType
  Public intY As Integer
  Public intM As Integer
  Public intD As Integer
End Structure

Private Function DT_Div(ByVal intX As Integer, ByVal intY As Integer) As Integer
  Dim dblTemp As Double
  Dim strTemp As String

  dblTemp = intX / intY
  strTemp = dblTemp.ToString
  If (InStr(strTemp, ".") <> 0) Then strTemp = Mid(strTemp, 1, InStr(strTemp, ".") - 1)
  DT_Div = Val(strTemp)
End Function

Public Sub DT_Init()
  DT_arrPDayInMonth(0) = 31
  DT_arrPDayInMonth(1) = 28
  DT_arrPDayInMonth(2) = 31
  DT_arrPDayInMonth(3) = 30
  DT_arrPDayInMonth(4) = 31
  DT_arrPDayInMonth(5) = 30
  DT_arrPDayInMonth(6) = 31
  DT_arrPDayInMonth(7) = 31
  DT_arrPDayInMonth(8) = 30
  DT_arrPDayInMonth(9) = 31
  DT_arrPDayInMonth(10) = 30
  DT_arrPDayInMonth(11) = 31
 
  DT_arrEDayInMonth(0) = 31
  DT_arrEDayInMonth(1) = 31
  DT_arrEDayInMonth(2) = 31
  DT_arrEDayInMonth(3) = 31
  DT_arrEDayInMonth(4) = 31
  DT_arrEDayInMonth(5) = 31
  DT_arrEDayInMonth(6) = 30
  DT_arrEDayInMonth(7) = 30
  DT_arrEDayInMonth(8) = 30
  DT_arrEDayInMonth(9) = 30
  DT_arrEDayInMonth(10) = 30
  DT_arrEDayInMonth(11) = 29
End Sub

Public Function DT_GetPDate(ByVal dtTemp As Date) As DT_DateType
  Dim intYear As Integer, intMonth As Integer, intDay As Integer
  Dim intGY As Integer, intGM As Integer, intGD As Integer
  Dim intJY As Integer, intJM As Integer, intJD As Integer
  Dim intGDayNo As Integer, intJDayNo As Integer, intJNP As Integer
  Dim intI As Integer

  intYear = dtTemp.Year
  intMonth = dtTemp.Month
  intDay = dtTemp.Day
 
  intGY = intYear - 1600
  intGM = intMonth - 1
  intGD = intDay - 1

  intGDayNo = 365 * intGY + DT_Div(intGY + 3, 4) - DT_Div(intGY + 99, 100) + DT_Div(intGY + 399, 400)
  For intI = 0 To intGM - 1
    intGDayNo += DT_arrPDayInMonth(intI)
  Next
  If ((intGM > 1) And ((intGY Mod 4 = 0 And intGY Mod 100 <> 0) Or (intGY Mod 400 = 0))) Then intGDayNo += 1
  intGDayNo += intGD
 
  intJDayNo = intGDayNo - 79

  intJNP = DT_Div(intJDayNo, 12053)
  intJDayNo = (intJDayNo Mod 12053)
  intJY = 979 + 33 * intJNP + 4 * DT_Div(intJDayNo, 1461)
  intJDayNo = (intJDayNo Mod 1461)
 
  If (intJDayNo >= 366) Then
    intJY += DT_Div(intJDayNo - 1, 365)
    intJDayNo = (intJDayNo - 1) Mod 365
  End If

  intI = 0
  While ((intI < 11) And (intJDayNo >= DT_arrEDayInMonth(intI)))
    intJDayNo -= DT_arrEDayInMonth(intI)
    intI += 1
  End While
  intJM = intI + 1
  intJD = intJDayNo + 1

  DT_GetPDate.intD = intJD
  DT_GetPDate.intM = intJM
  DT_GetPDate.intY = intJY
End Function

 

همانطور كه در كد فوق مشخص ميباشد، تمام كد به صورت يك فايل Module در زبان برنامه نويسي VB .NET نوشته شده است و براي استفاده از آن كافي است كه كد فوق را به صورت يك ماژول اين زبان ذخيره نموده و آنرا به برنامه هاي خود اضافه نماييد. براي استفاده از اين توابع بايد مراحل زير انجام شود.

در ابتداي اجراي برنامه و براي يك بار بايد تابع ()DT_Init را اجرا نماييد. اين تابع متغيرهاي مورد نياز براي اجراي صحيح تبديل تاريخ را مقدار دهي اوليه مي نمايد، اين مقادير عبارتند از دو متغير از نوع آرايه عددي كه تعداد روزهاي ماه هاي سال در تاريخ شمسي و ميلادي در آنها نگهداري ميشود.

پس از مقدار دهي اوليه، هر جايي كه احتياج به تبديل تاريخ از ميلادي به شمسي داشته باشيد مي توانيد با استفاده از تابع ()DT_GetPDate اين كار را انجام دهيد. اين تابع يك آرگومان دارد كه تاريخ ميلادي اي را كه مي خواهيد به تاريخ شمسي تبديل نماييد مشخص مي نمايد و از نوع Date مي باشد. خروجي اين تابع (مقدار بازگشتي تابع) نيز تاريخ شمسي متناظر با تاريخ ميلادي مشخص شده خواهد بود كه به صورت ساختار (Structure) تعريف شده در كدهاي فوق (با نام DT_DateType) خواهد بود. اين ساختار داراي سه مؤلفه عددي به نامهاي intD، intM و intY مي باشد كه بترتيب مشخص كننده روز، ماه و سال شمسي خواهند بود.

به اين ترتيب و با استفاده از كدهاي فوق قادر خواهيد بود تاريخهاي ميلادي موجود در برنامه خودتان را به راحتي به تاريخ شمسي تبديل نماييد و با اين كار باعث بهتر شدن كاركرد و بالاتر رفتن امكانات برنامه هاي خودتان شويد.

اين مقاله داراي يك فايل ضميمه ميباشد كه شامل برنامه اي به زبان VB .NET ميباشد كه با استفاده از توابع فوق قابليت تبديل هر تاريخ ميلادي به شمسي را دارا ميباشد. همانطور كه از تصوير اين برنامه مشخص است، در صفحه اصلي برنامه يك كامپوننت انتخاب تاريخ وجود دارد كه كاربر ميتواند با استفاده از آن تاريخ ميلادي مورد نظر خود را مشخص نمايد و پس از مشخص شدن هر تاريخ (به عبارتي با هر تغيير تاريخ ايجاد شده در اين كامپوننت) برنامه به طور خودكار تاريخ شمسي معادل با آن تاريخ را محاسبه نموده و در كادر پايين نمايش مي دهد. با مراجعه به برنامه متوجه خواهيد شد كه براي بهتر شدن شيوه نمايش تاريخ شمسي يك متغير به صورت آرايه اي از رشته هاي حرفي (String) در برنامه ايجاد شده است كه نام ماه هاي موجود در سالهاي شمسي در آن نگهداري ميشود و در هنگام نمايش تاريخ شمسي از آن براي نمايش بهتر اطلاعات استفاده ميشود. بديهي است كه شما نيز ميتوانيد با اضافه كردن توابع جديد اقدام به بهتر كردن كاربرد كدهاي فوق نماييد.

ضمیمه
  dateE2P.VB.NET.zipdateE2P.VB.NET.zipحجم فایل: ۳۱.۷۶ کیلوبایت - دریافت فایل: ۴۳۹

برنامه اي به زبان VB .NET كه با استفاده از توابع فوق قابليت تبديل هر تاريخ ميلادي به شمسي را دارا ميباشد.
 


 
 
© 2012 - WEBILIX websolutions