PDA

View Full Version : سوال: تاریخ



VB Master
شنبه 10 بهمن 1388, 20:40 عصر
با سلام و عرضه خسته نباشید خدمت تمامی دوستان .
من یک برنامه برای ویدئو کلوپ نوشتم که در یک قسمت با مشکل مواجه شدم .
زمانی که مشتری فیلم را به کلوپ تحویل می دهد برای محاسبه روزهایی که فیلم در دست مشتری بوده .
برای مثال در تاریخ 1388/05/02 مشتری فیلم را برده و در تاریخ 1388/05/04 فیلم را آورده .
برای محاسبه این نوع تاریخ خوب روزها را از هم کم کرده .
اما زمانی که مشتری برای مثال در تاریخ 1388/07/29 فیلم را برده و در تاریخ 1388/08/02 فیلم را آورده و یا 1388/12/29 تا 1389/01/01
چنین تاریخ هایی رو چگونه باید محاسبه کنم.
ممنون میشم اگر کسی یک فرمول کلی برای محاسبه همه نوع تاریخ را بدهد.
حتی ماه های 31 روزه
با تشکر

Rezapcclick
شنبه 10 بهمن 1388, 23:27 عصر
خوب ببین دوست من یه ماژولی هست که این ماژول میاد تاریخ سیستم رو به شمسی تبدیل می کنه.
شما این ماژول رو کپی کنین و بعد نوع تعریفتون رو Public بزارید تا هر جای پروژه خواستید بتونین استفاده کنین.

بعد یه تکست باکسی روی فرم بزارید و قابل رویت نشه Visible = False

بعد ماژول رو مقدار دهی کنید با تکست باکس و در آخر تو دستور ثبت بنویسید که اگر تاریخ کرایه بزرگتر از این بود و ....
صد در صد عملیه خودم برای پروژه آخری که نوشتم استفاده کردم



'--- API Functions ---------------------------'
Public Month_Name, Spring_Fall
Public Time_Difference, Time_Client
Public Base_Year
Public Add_or_Edit As Boolean
Public Jens_Kol As String
'--- Farsi Date Convertor --------------------'
Public Sub Get_Date(ByVal Days, Sal, Mah, Rooz)
Dim Years, Year_Length
Do While Days >= 0
If Kabiseh(Years) Then
Year_Length = 366
Else
Year_Length = 365
End If
If Days - Year_Length >= 0 Then
Years = Years + 1
Days = Days - Year_Length
Else
Sal = Base_Year + Years
If Days <= 185 Then
Mah = 1 + (Days \ 31)
Rooz = 1 + (Days Mod 31)
Else
Days = Days - 186
Mah = 7 + (Days \ 30)
Rooz = 1 + (Days Mod 30)
End If
Exit Sub
End If
Loop
End Sub
Public Function Kabiseh(ByVal Years)
Dim Temp
Kabiseh = False
Temp = (Base_Year + Years) - 1309
If (((Temp Mod 32) - (Temp \ 32)) Mod 4) = 0 Then Kabiseh = True
End Function
Public Property Let SFhour(x)
Spring_Fall = x
End Property
Public Property Let Time_Diff(ByVal t)
Time_Difference = t
End Property
Public Property Let state(ByVal S)
Month_Name = S
End Property
Public Function To_Hejri(ByVal what_date, Optional Month_Name)
Dim Days, Day_Name, Day_Number, Temp_Days, Months
Spring_Fall = False
If IsMissing(Month_Name) Then Month_Name = 0
Time_Difference = #12:00:00 AM#
Base_Year = 1332
Months = Array("ÝÑæÑÏíä", "ÇÑÏíÈåÔÊ", "ÎÑÏÇÏ", "ÊíÑ", "ãÑÏÇÏ", "ÔåÑíæÑ", "ãåÑ", "ÂÈÇä", "ÂÐÑ", "Ïí", "Èåãä", "ÇÓÝäÏ")
Day_Name = Array("í˜ÔäÈå", "ÏæÔäÈå", "Óå ÔäÈå", "åÇÑÔäÈå", "äÌÔäÈå", "ÌãÚå", "ÔäÈå")
Days = DateDiff("d", #3/21/1953#, what_date)
Day_Number = Weekday(what_date)
Dim Year_Length, Sal, Mah, Rooz, temp_date
If FormatDateTime(what_date + Time_Difference, vbShortDate) <> FormatDateTime(what_date, vbShortDate) Then
Days = Days + 1
Day_Number = (Day_Number + 1)
If Day_Number = 8 Then Day_Number = 1
End If
Time_Client = FormatDateTime(what_date + Time_Difference, vbLongTime)
Call Get_Date(Days, Sal, Mah, Rooz)
If ((Mah >= 1 And Mah <= 6) And Not ((Mah = 1 And Rooz = 1) Or (Mah = 6 And Rooz = 31))) And Spring_Fall = True Then
If FormatDateTime(what_date + Time_Difference + #1:00:00 AM#, vbShortDate) <> FormatDateTime(what_date + Time_Difference, vbShortDate) Then
Temp_Days = Days + 1
Day_Number = (Day_Number + 1)
If Day_Number = 8 Then Day_Number = 1
Else
Temp_Days = Days
End If
Time_Client = FormatDateTime(what_date + Time_Difference + #1:00:00 AM#, vbLongTime)
If Temp_Days <> Days Then
Days = Temp_Days
If Rooz = 30 And Mah = 6 Then
If DateDiff("n", Time_Client, #1:00:00 AM#) <= 60 And DateDiff("n", Time_Client, #1:00:00 AM#) >= 0 Then
Time_Client = FormatDateTime(what_date + Time_Difference, vbLongTime)
Days = Days - 1
If Day_Number = 1 Then
Day_Number = 7
Else
Day_Number = Day_Number - 1
End If
End If
End If
Call Get_Date(Days, Sal, Mah, Rooz)
End If
End If
If Month_Name = 0 Then
If Rooz < 10 Then Rooz = "0" & Rooz
If Mah < 10 Then Mah = "0" & Mah
To_Hejri = Sal & "/" & Mah & "/" & Rooz
ElseIf Month_Name = 1 Then
To_Hejri = Rooz & " " & Months(Mah - 1) & " " & Sal
ElseIf Month_Name = 2 Then
To_Hejri = Day_Name(Day_Number - 1) & " " & Rooz & "/" & Mah & "/" & Sal
ElseIf Month_Name = 3 Then
To_Hejri = Day_Name(Day_Number - 1) & " " & Rooz & " " & Months(Mah - 1) & " " & Sal
End If
End Function
Public Function To_Time(what_date)
Call To_Hejri(what_date)
To_Time = Time_Client
End Function
Public Sub Class_Initialize()
Spring_Fall = False
Month_Name = 0
Time_Difference = #12:00:00 AM#
Base_Year = 1332
End Sub
من این روش رو بلد بودم باز اگر دوستان روش دیگه ای رو دارن بگن
سوالی بود در خدمتم

lordarma
یک شنبه 11 بهمن 1388, 10:12 صبح
به نظر من اگر همه ماه ها را 30 روزه و حتی 29 روزه هم حساب کنی مشکلی پیش نمی آید!!!
البته فکر نمی کنم برای ویدیو کلوپ مهم باشد که تاریخ شمسی است یا میلادی...
منظورم اینه که برنامه را بر همان اساس میلادی بنویس،
و البته عدد ماه را ضرب در 30 کن،
برای ماه های 31 روزه و ماه 29 روزه (حتی سال کبیسه(؟!)!!!) هم می تونی از چند تا شرط استفاده کنی!
موفق باشی...

M.T.P
یک شنبه 11 بهمن 1388, 15:19 عصر
http://barnamenevis.org/forum/showthread.php?t=200739&page=2
پست دوازدهم

vbhamed
یک شنبه 11 بهمن 1388, 17:42 عصر
سلام

دقيقترين راه اينه كه تاريخ ميلادي رو هم به صورت مخفي تو ركوردهاتون ثبت كنيد چه تاريخ رفت و چه تاريخ برگشت
سپس بعد از برگشت كالا، با استفاده از تابع DateDiff دو تا تاريخ رو از هم كم كنيد كه براي استفاده از اين تابع به MSDN مراجعه كنيد
اين تابع مي‌تونه اختلاف دو زمان رو به سال يا ماه يا روز يا ساعت يا دقيقه يا ثانيه برگردونه

VB Master
یک شنبه 11 بهمن 1388, 18:24 عصر
واقعا مر30 از تمامی دوستان
من در برنامه ام برای تاریخ خروج فیلم 3 تکس باکس قرار داده ام .
یعنی یکی برای روز . یکی برای ماه و یکی برای سال و در فرم تحویل فیلم به کلوپ هم باز سه تکس باکس به همین صورت قرار دارد
یعنی در آخر دو تکس باکس برای روز یکی خروج یکی تحویل و دو ماه و دو سال
اینو چجوری محاسبه کنم ؟
اصلا ربطی به تاریخ سیستم و تاریخ میلادی نداره.

با تشکر .

lordarma
سه شنبه 13 بهمن 1388, 01:10 صبح
خب به نظرم شما یکم کار رو پیچوندید!
شاید لازم نبود از 3 تا تکس باکس استفاده کنید...
به هر حال!
برای اینکه تاریخ را در 3 تکس باکس داشته باشید باید با استفاده از تابع Mid قسمت های مختلف (یعنی سال،ماه،روز) را از تاریخ جدا کنید،
سپس محتویات هر تکس باکس را با تابع Val به مقدار عددی تبدیل کنید و عملیات ریاضی را روی آن انجام دهید،
در نهایت با استفاده از توابع CStr یا Str ، مقدار عددی را برای نمایش به رشته تبدیل کنید.
حالا در کدوم قسمت مشکل دارید؟!
موفق باشید

vbhamed
چهارشنبه 14 بهمن 1388, 11:39 صبح
واقعا مر30 از تمامی دوستان
من در برنامه ام برای تاریخ خروج فیلم 3 تکس باکس قرار داده ام .
یعنی یکی برای روز . یکی برای ماه و یکی برای سال و در فرم تحویل فیلم به کلوپ هم باز سه تکس باکس به همین صورت قرار دارد
یعنی در آخر دو تکس باکس برای روز یکی خروج یکی تحویل و دو ماه و دو سال
اینو چجوری محاسبه کنم ؟
اصلا ربطی به تاریخ سیستم و تاریخ میلادی نداره.

با تشکر .

سلام

مسئله 3 تا TextBox شما نیست و اینکه چطوری تاریخ رو از کاربر می‌گیرید
ما می خوایم محاسبات رو درست انجام بدیم

شما تاریخ شمسی که مشتری چیزی رو می بره باید به میلادی تبدیل کنید و تاریخ برگشت رو هم همینطور

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

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

البته يك dll به نام shamsi.dll تو سايت هست كه فكر كنم بتونه اين كار رو براي شما انجام بده