דוד, כל הכבוד על התשובות מאירות העיניים שלך, הלוואי והיה לי אחד כזה בשנותי הראשונות . . .
@avr416
מה זה DateDif?
אני לא מכיר את שפת ויזואל בייסיק..
ואינני מכיר מתודה שממשת את זה בC#.
כתבת את הלוגיקה, אבל השארת פונקציה שעושה חישוב ספציפי, בפעם הבאה שתצטרך חישוב מרווח בין חודשים תעשה העתק-הדבק?
בשם עיקרון ה Reusability היה עדיף שתכין מזה פונקציה כללית, לדוגמה : תן פרמטר נוסף שישמש כ "תאריך עד", תן שם גנרי יותר ותשים בקלאס public static וכו'
ועוד משהו שארכיטקט כתב פה בימים האחרונים, מתכנת צריך לרכוש את אומנות הגיגול, זה חלק מארגז הכלים הבסיסי למתכנת, בגיגול קצר היית מוצא את זה:
//----------------------------------------------------------------------------------------
// Copyright © 2003 - 2013 Tangible Software Solutions Inc.
// This class can be used by anyone provided that the copyright notice remains intact.
//
// This class simulates the behavior of the classic VB 'DateDiff' function.
//----------------------------------------------------------------------------------------
public static partial class Simulate
{
public enum DateInterval
{
Day,
DayOfYear,
Hour,
Minute,
Month,
Quarter,
Second,
Weekday,
WeekOfYear,
Year
}
public static long DateDiff(DateInterval intervalType, System.DateTime dateOne, System.DateTime dateTwo)
{
switch (intervalType)
{
case DateInterval.Day:
case DateInterval.DayOfYear:
System.TimeSpan spanForDays = dateTwo - dateOne;
return (long)spanForDays.TotalDays;
case DateInterval.Hour:
System.TimeSpan spanForHours = dateTwo - dateOne;
return (long)spanForHours.TotalHours;
case DateInterval.Minute:
System.TimeSpan spanForMinutes = dateTwo - dateOne;
return (long)spanForMinutes.TotalMinutes;
case DateInterval.Month:
return ((dateTwo.Year - dateOne.Year) * 12) + (dateTwo.Month - dateOne.Month);
case DateInterval.Quarter:
long dateOneQuarter = (long)System.Math.Ceiling(dateOne.Month / 3.0);
long dateTwoQuarter = (long)System.Math.Ceiling(dateTwo.Month / 3.0);
return (4 * (dateTwo.Year - dateOne.Year)) + dateTwoQuarter - dateOneQuarter;
case DateInterval.Second:
System.TimeSpan spanForSeconds = dateTwo - dateOne;
return (long)spanForSeconds.TotalSeconds;
case DateInterval.Weekday:
System.TimeSpan spanForWeekdays = dateTwo - dateOne;
return (long)(spanForWeekdays.TotalDays / 7.0);
case DateInterval.WeekOfYear:
System.DateTime dateOneModified = dateOne;
System.DateTime dateTwoModified = dateTwo;
while (dateTwoModified.DayOfWeek != System.Globalization.DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek)
{
dateTwoModified = dateTwoModified.AddDays(-1);
}
while (dateOneModified.DayOfWeek != System.Globalization.DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek)
{
dateOneModified = dateOneModified.AddDays(-1);
}
System.TimeSpan spanForWeekOfYear = dateTwoModified - dateOneModified;
return (long)(spanForWeekOfYear.TotalDays / 7.0);
case DateInterval.Year:
return dateTwo.Year - dateOne.Year;
default:
return 0;
}
}
}
פורסם במקור בפורום CODE613 ב02/07/2015 12:37 (+03:00)