You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
7.2 KiB

10 years ago
  1. using System;
  2. using System.Globalization;
  3. namespace Sevomin.Models.Helpers
  4. {
  5. public class DateAssist
  6. {
  7. public class FromToDate
  8. {
  9. public DateTime Start;
  10. public DateTime End;
  11. public string startShamsi;
  12. public string endShamsi;
  13. }
  14. /// <summary>
  15. /// None Zero-Based month number
  16. /// </summary>
  17. /// <param name="monthNumber"></param>
  18. /// <returns></returns>
  19. public static string GetPersianMonthName(int monthNumber)
  20. {
  21. switch (monthNumber)
  22. {
  23. case 1:
  24. return "فروردین";
  25. case 2:
  26. return "اردیبهشت";
  27. case 3:
  28. return "خرداد";
  29. case 4:
  30. return "تیر";
  31. case 5:
  32. return "مرداد";
  33. case 6:
  34. return "شهریور";
  35. case 7:
  36. return "مهر";
  37. case 8:
  38. return "آبان";
  39. case 9:
  40. return "آذر";
  41. case 10:
  42. return "دی";
  43. case 11:
  44. return "بهمن";
  45. case 12:
  46. return "اسفند";
  47. default:
  48. throw new ArgumentException("شماره ماه باید بین 1 تا 12 باشد.", "monthNumber", null);
  49. }
  50. }
  51. public static string GetFullPersianDate(DateTime value)
  52. {
  53. PersianCalendar pc = new PersianCalendar();
  54. return string.Format("{0} {1} {2}",
  55. pc.GetDayOfMonth(value), GetPersianMonthName(pc.GetMonth(value)),
  56. pc.GetYear(value));
  57. }
  58. public static DateTime? ValidateAndSetToMiladi(string value, DateTime? defaultValue = null)
  59. {
  60. string vd = ValidateDate(value);
  61. if (string.IsNullOrEmpty(vd))
  62. return defaultValue;
  63. return ToMiladi(vd);
  64. }
  65. public static DateTime ToMiladi(string value)
  66. {
  67. if (value == "" || value == null)
  68. return DateTime.MinValue;
  69. PersianCalendar pc = new PersianCalendar();
  70. DateTime mil;
  71. mil = pc.ToDateTime(int.Parse(value.Substring(0, 4)),
  72. int.Parse(value.Substring(5, 2)), int.Parse(value.Substring(8, 2))
  73. , 0, 0, 0, 0);
  74. return mil;
  75. }
  76. public static string ToShamsi(DateTime value)
  77. {
  78. if (value == DateTime.MinValue)
  79. return string.Empty;
  80. PersianCalendar pc = new PersianCalendar();
  81. return string.Format("{0:0000}/{1:00}/{2:00}",
  82. pc.GetYear(value), pc.GetMonth(value),
  83. pc.GetDayOfMonth(value));
  84. }
  85. public static string ValidateDate(string value)
  86. {
  87. if (value == null)
  88. return "";
  89. int offset = 0;
  90. if (value.Length == 8) //13801010
  91. {
  92. value = value.Insert(4, "/");
  93. value = value.Insert(7, "/");
  94. }
  95. if (int.TryParse(value, out offset))
  96. {
  97. if (offset > 500 || offset < -500)
  98. return "";
  99. return ToShamsi(DateTime.Today.AddDays(offset));
  100. }
  101. else
  102. {
  103. try
  104. {
  105. DateTime val = ToMiladi(value);
  106. if (val < DateTime.Today.AddYears(-5) ||
  107. val > DateTime.Today.AddYears(10))
  108. return "";
  109. return value;
  110. }
  111. catch (Exception)
  112. {
  113. return "";
  114. }
  115. }
  116. }
  117. public static FromToDate GetThisMonth()
  118. {
  119. PersianCalendar pc = new PersianCalendar();
  120. DateTime value = DateTime.Today;
  121. return GetMonth(pc.GetMonth(value));
  122. }
  123. /// <summary>
  124. /// returns date of 1st and last day of month as a
  125. /// FromToDate object
  126. /// </summary>
  127. /// <param name="monthIndex">Index of Mounth 1-based</param>
  128. /// <returns>FromToDate object</returns>
  129. public static FromToDate GetMonth(int monthIndex)
  130. {
  131. PersianCalendar pc = new PersianCalendar();
  132. FromToDate ftd = new FromToDate();
  133. DateTime value = DateTime.Today;
  134. string startShamsi = string.Format("{0:0000}/{1:00}/{2:00}",
  135. pc.GetYear(value), monthIndex,
  136. 1);
  137. string endShamsi = string.Format("{0:0000}/{1:00}/{2:00}",
  138. pc.GetYear(value), monthIndex,
  139. pc.GetDaysInMonth(pc.GetYear(value), monthIndex));
  140. ftd.Start = ToMiladi(startShamsi);
  141. ftd.End = ToMiladi(endShamsi);
  142. ftd.startShamsi = startShamsi;
  143. ftd.endShamsi = endShamsi;
  144. return ftd;
  145. }
  146. public static String NextMonth(string currentDate, int dayOfMonth)
  147. {
  148. return NextMonth(currentDate, dayOfMonth, 1);
  149. }
  150. public static String NextMonth(string currentDate, int dayOfMonth, int monthInterval)
  151. {
  152. try
  153. {
  154. PersianCalendar pc = new PersianCalendar();
  155. int year = int.Parse(currentDate.Substring(0, 4));
  156. int month = int.Parse(currentDate.Substring(5, 2));
  157. month += monthInterval;
  158. if (month > 12)
  159. {
  160. year += 1;
  161. month = 1;
  162. }
  163. if (pc.GetDaysInMonth(year, month) < dayOfMonth)
  164. dayOfMonth = pc.GetDaysInMonth(year, month);
  165. return string.Format("{0:0000}/{1:00}/{2:00}", year, month, dayOfMonth);
  166. }
  167. catch (Exception)
  168. {
  169. return "";
  170. }
  171. }
  172. public static string ToPersianNumbers(string number)
  173. {
  174. char[] temp = new char[number.Length];
  175. for (int i = 0; i < number.Length; i++)
  176. {
  177. char value = number[i];
  178. if (value >= 48 && value <= 57)
  179. temp[i] = (char)(value + 1728);
  180. else
  181. temp[i] = value;
  182. }
  183. return new String(temp);
  184. }
  185. public static int GetJalaliWeekNumber(DateTime gregorianDate)
  186. {
  187. PersianCalendar pc = new PersianCalendar();
  188. DateTime gregYearStart = pc.ToDateTime(pc.GetYear(gregorianDate), 1, 1, 0, 0, 0, 0);
  189. int diff = (gregorianDate - gregYearStart).Days;
  190. int wd = ((int)pc.GetDayOfWeek(gregorianDate) + 2) % 7;
  191. return (diff - wd + 10) / 7;
  192. }
  193. }
  194. }