296 lines
9.6 KiB
C#
296 lines
9.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace Complex.Application.Utility
|
|
{
|
|
public class PersianDate
|
|
{
|
|
public struct PDate
|
|
{
|
|
public int Year { set; get; }
|
|
public int Month { set; get; }
|
|
public int Day { set; get; }
|
|
}
|
|
public PersianDate()
|
|
{
|
|
|
|
}
|
|
public static DateTime CurrentDate
|
|
{
|
|
get
|
|
{
|
|
return DateTime.Now;
|
|
}
|
|
}//= DateTime.Now;
|
|
public static PersianCalendar persianDate = new PersianCalendar();
|
|
|
|
public static DateTime ConvertToMiladi(string PersianDateString)
|
|
{
|
|
if (PersianDateString.IsNullOrEmpty())
|
|
return new DateTime();
|
|
DateTime date;
|
|
var splitP = PersianDateString.Substring(0, 10).Split("- /".ToCharArray()).Select(d => d.ToInt().Value).ToArray();
|
|
date = new DateTime(splitP[0], splitP[1], splitP[2], persianDate);
|
|
return date;
|
|
}
|
|
|
|
public static int CurrentPersianYear
|
|
{
|
|
get
|
|
{
|
|
return persianDate.GetYear(CurrentDate);
|
|
}
|
|
}
|
|
public static int CurrentPersianMonth
|
|
{
|
|
get
|
|
{
|
|
return persianDate.GetMonth(CurrentDate);
|
|
}
|
|
}
|
|
public static int CurrentPersianDay
|
|
{
|
|
get
|
|
{
|
|
return persianDate.GetDayOfMonth(CurrentDate);
|
|
}
|
|
}
|
|
public static List<string> PersianWeekDay = new List<string>()
|
|
{
|
|
"شنبه",
|
|
"یکشنبه",
|
|
"دوشنبه",
|
|
"سه شنبه",
|
|
"چهارشنبه",
|
|
"پنج شنبه",
|
|
"جمعه"
|
|
};
|
|
public static List<string> PersianMonth = new List<string>()
|
|
{
|
|
"فروردین",
|
|
"اردیبهشت",
|
|
"خرداد",
|
|
"تیر",
|
|
"مرداد",
|
|
"شهریور",
|
|
"مهر",
|
|
"آبان",
|
|
"آذر",
|
|
"دی",
|
|
"بهمن",
|
|
"اسفند"
|
|
};
|
|
public static string CurrentMonth
|
|
{
|
|
get
|
|
{
|
|
return PersianMonth[persianDate.GetMonth(DateTime.Now) - 1];
|
|
}
|
|
}
|
|
public static string CurrntWeekDay
|
|
{
|
|
get
|
|
{
|
|
try
|
|
{
|
|
var d = (int)persianDate.GetDayOfWeek(DateTime.Now);
|
|
if (d == 6)
|
|
d = -1;
|
|
return PersianWeekDay[d + 1];
|
|
}
|
|
catch { return persianDate.GetDayOfWeek(DateTime.Now).ToString() + "," + (int)persianDate.GetDayOfWeek(DateTime.Now); }
|
|
}
|
|
}
|
|
public static int CurrentDaysInMonth
|
|
{
|
|
get
|
|
{
|
|
return persianDate.GetDaysInMonth(CurrentPersianYear, CurrentPersianMonth);
|
|
}
|
|
}
|
|
public static int StartDayInWeek(int Year, int Month)
|
|
{
|
|
DateTime dt = ConvertToMiladi(Year + "/" + Month.ToString().PadLeft(2, '0') + "/01");
|
|
var d = (int)dt.DayOfWeek;
|
|
if (d == 6)
|
|
d = -1;
|
|
return d + 1;
|
|
}
|
|
public static int CurrentDayInWeek
|
|
{
|
|
get
|
|
{
|
|
try
|
|
{
|
|
var d = (int)persianDate.GetDayOfWeek(DateTime.Now);
|
|
if (d == 6)
|
|
d = -1;
|
|
return d + 1;
|
|
}
|
|
catch { return 0; }
|
|
}
|
|
}
|
|
|
|
public static string GetToday()
|
|
{
|
|
return GetDate(DateTime.Now);
|
|
|
|
//return Year + "/" + ((Month < 10) ? "0" + Month : Month.ToString()) + ((Day < 10) ? "0" + Day : Day.ToString());
|
|
}
|
|
public static string GetDateStringFormat(string date, bool showIntervalDate = false)
|
|
{
|
|
if (date.IsNullOrEmpty())
|
|
return "--";
|
|
date = date.Trim();
|
|
string today = GetToday();
|
|
if (date == today)
|
|
return "امروز";
|
|
string yesterday = GetDate(DateTime.Now.AddDays(-1));
|
|
if (yesterday == today)
|
|
return "دیروز";
|
|
string twoYesterday = GetDate(DateTime.Now.AddDays(-2));
|
|
if (twoYesterday == today)
|
|
return "دو روز پیش";
|
|
string treeYesterday = GetDate(DateTime.Now.AddDays(-3));
|
|
if (treeYesterday == today)
|
|
return "سه روز پیش";
|
|
if (showIntervalDate)
|
|
{
|
|
var m1 = ConvertToMiladi(date);
|
|
var diff = DateTime.Now - m1;
|
|
|
|
return (int)diff.TotalDays + " روز پیش";
|
|
}
|
|
else
|
|
return date.Substring(8).ToInt() + " " + PersianMonth[date.Substring(5, 2).ToInt().Value - 1] + " ماه " + date.Substring(0, 4);
|
|
}
|
|
|
|
public static int? GetDateDiff(string date1, string date2)
|
|
{
|
|
if (date1.IsNullOrEmpty() || date2.IsNullOrEmpty())
|
|
return null;
|
|
string today = GetToday();
|
|
var m1 = ConvertToMiladi(date1);
|
|
var m2 = ConvertToMiladi(date2);
|
|
var diff = m2 - m1;
|
|
|
|
return (int)diff.TotalDays;
|
|
}
|
|
|
|
public static string GetDate(DateTime day)
|
|
{
|
|
int Year = persianDate.GetYear(day);
|
|
int Month = persianDate.GetMonth(day);
|
|
int Day = persianDate.GetDayOfMonth(day);
|
|
|
|
return string.Format("{0:D2}/{1:D2}/{2:D2}", Year, Month, Day);
|
|
//return Year + "/" + ((Month < 10) ? "0" + Month : Month.ToString()) + ((Day < 10) ? "0" + Day : Day.ToString());
|
|
}
|
|
public static PDate GetPDate(DateTime day)
|
|
{
|
|
PDate pdate = new PDate();
|
|
pdate.Year = persianDate.GetYear(day);
|
|
pdate.Month = persianDate.GetMonth(day);
|
|
pdate.Day = persianDate.GetDayOfMonth(day);
|
|
return pdate;
|
|
}
|
|
public static string ToStandard(string _date)
|
|
{
|
|
if (_date.IsNullOrEmpty())
|
|
return _date;
|
|
try
|
|
{
|
|
var a = _date.Split('/').Select(i => i.ToInt().Value).ToArray();
|
|
if (a.Count() < 2)
|
|
return _date;
|
|
return string.Format("{0:D2}/{1:D2}/{2:D2}", a[0], a[1], a[2]);
|
|
}
|
|
catch
|
|
{
|
|
return "";
|
|
}
|
|
//return Year + "/" + ((Month < 10) ? "0" + Month : Month.ToString()) + ((Day < 10) ? "0" + Day : Day.ToString());
|
|
}
|
|
|
|
public static string GetNowTime(bool BySecond = false, bool ByMiliSecond = false)
|
|
{
|
|
DateTime dnow = DateTime.Now;
|
|
return GetTime(dnow, BySecond, ByMiliSecond);
|
|
}
|
|
public static string GetTime(DateTime DT, bool BySecond = false, bool ByMiliSecond = false)
|
|
{
|
|
int minutes = DT.Minute;
|
|
int Hour = DT.Hour;
|
|
int Second = DT.Second;
|
|
bool AN = DT.ToLongTimeString().ToLower().Contains("pm") || DT.ToLongTimeString().Contains("ب");
|
|
|
|
if (AN && Hour < 12)
|
|
Hour += 12;
|
|
|
|
string time = string.Format("{0:D2}:{1:D2}", Hour, minutes); //((Hour < 10) ? "0" + Hour : Hour.ToString()) + ":" + ((minutes < 10) ? "0" + minutes : minutes.ToString());
|
|
if (BySecond)
|
|
time += ":" + (Second < 10 ? "0" + Second : Second.ToString());
|
|
if (ByMiliSecond)
|
|
time += ":" + DT.Millisecond;
|
|
|
|
return time;
|
|
}
|
|
|
|
public static string GetNowDateTime(bool BySecond = false, bool ByMiliSecond = false)
|
|
{
|
|
return GetToday() + " - " + GetNowTime(BySecond, ByMiliSecond);
|
|
}
|
|
|
|
public static string GetDateTime(DateTime DT, bool BySecond = false)
|
|
{
|
|
return GetDate(DT) + " - " + GetTime(DT, BySecond);
|
|
}
|
|
|
|
/// <summary>
|
|
/// محاسبه اختلاف دو زمان به ساعت و دقیقه
|
|
/// </summary>
|
|
/// <param name="beginTime">زمان شروع</param>
|
|
/// <param name="endTime">زمان پایان</param>
|
|
/// <returns></returns>
|
|
public static string GetTimeDiff(string beginTime, string endTime)
|
|
{
|
|
var begin = beginTime.Split(':').Select(int.Parse).ToArray();
|
|
var end = endTime.Split(':').Select(int.Parse).ToArray();
|
|
int beginMinutes = begin[0] * 60 + begin[1];
|
|
int endMinutes = end[0] * 60 + end[1];
|
|
|
|
int diffMinutes = endMinutes - beginMinutes;
|
|
|
|
int hour = diffMinutes / 60;
|
|
int minute = diffMinutes % 60;
|
|
|
|
return string.Format("{0:D2}:{1:D2}", hour, minute);
|
|
}
|
|
|
|
/// <summary>
|
|
/// بررسی صحت یک رشته از نظر فرمت تاریخ
|
|
/// </summary>
|
|
/// <param name="date">تاریخ</param>
|
|
/// <returns></returns>
|
|
public static bool HasDateFormat(string date)
|
|
{
|
|
Regex regex = new Regex(@"^([12]\d{3}\/(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01]))$");
|
|
return regex.IsMatch(date);
|
|
}
|
|
|
|
/// <summary>
|
|
/// بررسی صحت یک رشته از نظر فرمت زمان
|
|
/// </summary>
|
|
/// <param name="time">زمان</param>
|
|
/// <returns></returns>
|
|
public static bool HasTimeFormat(string time)
|
|
{
|
|
Regex regex = new Regex(@"^([01]?[0-9]|2[0-3]):[0-5][0-9]$");
|
|
return regex.IsMatch(time);
|
|
}
|
|
}
|
|
}
|