using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HealthMonitor.Common { public class DateTimeUtil { /// /// 时间类型转成时间戳 /// /// Local Time /// public static long ConvertToTimeStamp(DateTime time) { long intResult = 0; DateTime startTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1), TimeZoneInfo.Utc, TimeZoneInfo.Local); intResult = (long)(time - startTime).TotalMilliseconds; return intResult; } /// /// 毫秒时间戳转本地时间 /// /// /// public static DateTime GetDateTimeFromUnixTimeMilliseconds(long milliseconds) { DateTimeOffset dt0 = DateTimeOffset.FromUnixTimeMilliseconds(milliseconds); //默认为UTC时间:{2019/11/14 1:53:26} //DateTime dt1 = dt0.DateTime; //转为本地时区:{2019/11/14 9:53:26} DateTime dt2 = dt0.LocalDateTime; return dt2; } /// /// 判断给定的日期时间字符串是否符合相应的格式 /// /// 日期时间字符串 /// 是否符合格式 public static bool IsDateTime(string strDate) { if (strDate.Length != 19) return false; try { DateTime dt = DateTime.Parse(strDate); return true; } catch { return false; } } /// /// 得到当前月的第一天 /// /// 当前月的第一天 public static string ThisMonthFirstDate { get { DateTime dt = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1); return dt.ToString("yyyy-MM-dd HH:mm:ss"); } } /// /// 得到当前月的最后一天 /// /// 当前月的最后一天 public static string ThisMonthLastDate { get { DateTime dt = new DateTime(DateTime.Today.Year, DateTime.Today.Month + 1, 1); dt = dt.AddDays(-1); return dt.ToString("yyyy-MM-dd HH:mm:ss"); } } /// /// 指定日期的该月第一天 /// /// 指定的日期 /// 该月第一天 public static string MonthFirstDate(string sThisDate) { int nYear = Year(sThisDate); int nMonth = Month(sThisDate); int nDay = 1; return EncodeDate(nYear, nMonth, nDay) + " 00:00:00"; } /// /// 指定日期的该月最后一天 /// /// 指定的日期 /// 该月最后一天 public static string MonthLastDate(string sThisDate) { int nYear = Year(sThisDate); int nMonth = Month(sThisDate); nMonth++; if (nMonth == 13) { nYear++; nMonth = 1; } DateTime dt = new DateTime(nYear, nMonth, 1); dt = dt.AddDays(-1); return dt.ToString("yyyy-MM-dd HH:mm:ss"); } /// /// 转换字符串类型的时间至日期时间类型 /// /// 时间字符串 /// 日期时间类型的值 /// 如果格式不正确,则返回当前的时间 public static DateTime ToDateTime(string strDateTime) { try { return DateTime.Parse(strDateTime); } catch { return DateTime.Now; } } /// /// 转换时间类型的字符串至日期时间类型 /// /// 时间字符串 /// 时间值 /// 如果格式不正确,则返回的是"00:00:00"的时间值 public static DateTime ToTime(string strTime) { try { return DateTime.Parse(strTime); } catch { return DateTime.Parse("00:00:00"); } } /// /// 将时间值转换至时间字符串 /// /// 时间值 /// 时间字符串 public static string ToTimeStr(DateTime time) { return time.ToString("HH:mm:ss"); } /// /// 将对象转换为指定格式的字符串 /// /// 待转换的对象 /// 指定的字符串格式 /// 转换后的字符串 /// 如果为空值,或非日期时间对象,则返回"" public static string ToTimeStr(object time, string sFormat) { if (time == null || time == DBNull.Value) return ""; else { try { return ((DateTime)time).ToString(sFormat); } catch { return ""; } } } /// /// 将对象转换为字符串,格式为"HH:mm:ss" /// /// 待转换的对象 /// 转换后的字符串 public static string ToTimeStr(object time) { return ToTimeStr(time, "HH:mm:ss"); } /// /// 从秒数转换为时间字符串 /// /// 秒数 /// 时间字符串 public static string ToTimeStrFromSecond(int Second) { //=========== 1. 得到小时、分钟和秒数 =========== string sTimeStr = ""; int NewSecond = 0; int hour = Math.DivRem(Second, 3600, out NewSecond); //小时 Second = NewSecond; NewSecond = 0; int minute = Math.DivRem(Second, 60, out NewSecond); //分钟 //============ 2. 得到返回的字符串 ============ if (hour < 10) sTimeStr = sTimeStr + "0" + hour.ToString() + ":"; else sTimeStr = sTimeStr + hour.ToString() + ":"; if (minute < 10) sTimeStr = sTimeStr + "0" + minute.ToString() + ":"; else sTimeStr = sTimeStr + minute.ToString() + ":"; if (NewSecond < 10) sTimeStr = sTimeStr + "0" + NewSecond.ToString(); else sTimeStr = sTimeStr + NewSecond.ToString(); return sTimeStr; } /// /// 将时间字符串转换为秒数 /// /// 时间字符串 /// 转换后的秒数 public static int ToSecondsFromTimeStr(string timeStr) { DateTime dt = ToTime(timeStr); return dt.Hour * 3600 + dt.Minute * 60 + dt.Second; } /// /// 将日期时间值转换为日期字符串 /// /// 日期时间值 /// 日期字符串 public static string ToDateStr(DateTime dt) { return dt.ToString("yyyy-MM-dd"); } /// /// 将对象转换为日期字符串 /// /// 对象 /// 缺省字符串 /// 转换后的字符串。如果为空值,则按缺省值返回 public static string ToDateStr(object dt, string defaultStr) { if (dt == null || dt is System.DBNull) return defaultStr; else return ((DateTime)dt).ToString("yyyy-MM-dd"); } /// /// 将对象转换为日期字符串 /// /// 对象 /// 转换后的字符串。如果转换不成功,则返回"" public static string ToDateStr(object dt) { return ToDateStr(dt, ""); } /// /// 将日期时间值转换为字符串 /// /// 日期时间值 /// 字符串(len=19) public static string ToDateTimeStr(DateTime dt) { return dt.ToString("yyyy-MM-dd HH:mm:ss"); } public static string ToDateTimeStrWithMilliSeconds(DateTime dt) { int nMilliSeconds = dt.Millisecond; return dt.ToString("yyyy-MM-dd HH:mm:ss") + "." + nMilliSeconds.ToString("000"); } /// /// 将对象转换为日期时间字符串 /// /// 对象 /// 转换不成功时所取的缺省字符串 /// 转换后的日期时间字符串(len=19) public static string ToDateTimeStr(object dt, string defaultStr) { return ToDateTimeStr(dt, defaultStr, "yyyy-MM-dd HH:mm:ss"); } /// /// 将对象转换为日期时间字符串 /// /// 对象 /// 转换后的日期时间字符串(len=19) /// 如果转换不成功,则返回"" public static string ToDateTimeStr(object dt) { return ToDateTimeStr(dt, "", "yyyy-MM-dd HH:mm:ss"); } /// /// 将对象转换为指定格式的日期时间字符串 /// /// 对象 /// 缺省字符串 /// 格式 /// 转换后的字符串 public static string ToDateTimeStr(object dt, string defaultStr, string sFormat) { if (dt == null || dt is System.DBNull) return defaultStr; else return ((DateTime)dt).ToString(sFormat); } /// /// 获取当前的时间 /// public static string Now { get { return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } } /// /// 带毫秒部分的当前时间,示例为2003.07.22 10:02:52.136 /// public static string NowWithMilliSeconds { get { DateTime dtNow = DateTime.Now; int nMilliSeconds = dtNow.Millisecond; return dtNow.ToString("yyyy-MM-dd HH:mm:ss") + "." + nMilliSeconds.ToString("000"); } } /// /// 获取当前的时间 /// public static string Today { get { return DateTime.Today.ToString("yyyy-MM-dd HH:mm:ss"); } } /// /// 获取日期的年份 /// /// 日期时间串 /// 年份 public static int Year(string dtString) { int nYear; nYear = Convert.ToInt32(dtString.Substring(0, 4)); return nYear; } /// /// 获取日期的月份 /// /// 日期时间串 /// 月份 public static int Month(string dtString) { int nMonth; nMonth = Convert.ToInt32(dtString.Substring(5, 2)); return nMonth; } /// /// 获取日期中该月的第几天 /// /// 日期时间串 /// 该月的第几天 public static int Day(string dtString) { int nDay; nDay = Convert.ToInt32(dtString.Substring(8, 2)); return nDay; } /// /// 获取日期中的小时部分 /// /// 日期时间串 /// 小时部分 public static int Hour(string dtString) { int nHour; if (dtString.Length != 19 && dtString.Length != 23) return 0; nHour = Convert.ToInt32(dtString.Substring(11, 2)); return nHour; } /// /// 获取日期中的分钟部分 /// /// 日期时间串 /// 分钟部分 public static int Minute(string dtString) { int nMinute; if (dtString.Length != 19 && dtString.Length != 23) return 0; nMinute = Convert.ToInt32(dtString.Substring(14, 2)); return nMinute; } /// /// 获取日期中的秒部分 /// /// 日期时间串 /// 秒部分 public static int Second(string dtString) { int nSecond; if (dtString.Length != 19 && dtString.Length != 23) return 0; nSecond = Convert.ToInt32(dtString.Substring(17, 2)); return nSecond; } /// /// 获取表示的日期是星期几 /// /// 日期时间串 /// 星期几 /// 返回值从0至6;星期日为0,星期六为6 public static int DayOfWeek(string dtString) { DateTime dt = DateTime.Parse(dtString); return (int)dt.DayOfWeek; } /// /// 获取表示的日期是一年中的第几天 /// /// 日期时间串 /// 一年中的第几天 public static int DayOfYear(string dtString) { DateTime dt = DateTime.Parse(dtString); return dt.DayOfYear; } /// /// 将指定的月份数加到日期值上 /// /// 原来的日期 /// 指定的月份数 /// 得到的日期 public static string AddMonths(string dtString, int nOffset) { DateTime dt = DateTime.Parse(dtString); DateTime dtRes = dt.AddMonths(nOffset); return dtRes.ToString("yyyy-MM-dd HH:mm:ss"); } /// /// 将指定的天数加到日期值上 /// /// 原来的日期 /// 指定的天数 /// 得到的日期 /// 天数可以为负数 public static string AddDays(string dtString, int offset) { DateTime dt = DateTime.Parse(dtString); DateTime dtRes = dt.AddDays(offset); return dtRes.ToString("yyyy-MM-dd HH:mm:ss"); } /// /// 将指定的秒数加到日期值上 /// /// 原来的日期时间 /// 指定的秒数 /// 得到的日期时间 /// 秒数可以为负数 public static string AddSeconds(string dtString, int offset) { DateTime dt = DateTime.Parse(dtString); DateTime dtRes = dt.AddSeconds(offset); return dtRes.ToString("yyyy-MM-dd HH:mm:ss"); } public static string AddMilliSeconds(string dtString, int offset) { DateTime dt = DateTime.Parse(dtString); DateTime dtRes = dt.AddMilliseconds(offset); int nMilliSeconds = dtRes.Millisecond; return dtRes.ToString("yyyy-MM-dd HH:mm:ss") + "." + nMilliSeconds.ToString("000"); } public static string AddMilliSeconds(string dtString, double offset) { DateTime dt = DateTime.Parse(dtString); DateTime dtRes = dt.AddMilliseconds(offset); int nMilliSeconds = dtRes.Millisecond; return dtRes.ToString("yyyy-MM-dd HH:mm:ss") + "." + nMilliSeconds.ToString("000"); } /// /// 得到两个日期时间之间相差的天数 /// /// 起始日期 /// 终止日期 /// 相差的天数 /// /// 不判断时间的情况。只判断日期是否切换,即使时间相差仅数分钟, /// 只要切换了日期,也计算相差的天数。例如,2005-05-05 23:58:58和 /// 2005-05-06 00:02:03之间所差的天数也是1。 /// public static int DaysAfter(string dtFromString, string dtToString) { DateTime dtFrom = DateTime.Parse(dtFromString).Date; DateTime dtTo = DateTime.Parse(dtToString).Date; TimeSpan timeSpan = dtTo - dtFrom; return (int)timeSpan.TotalDays; } /// /// 得到两个日期时间之间相差的秒数 /// /// 起始日期时间 /// 终止日期时间 /// 相差的秒数 public static int SecondsAfter(string dtFromString, string dtToString) { DateTime dtFrom = DateTime.Parse(dtFromString); DateTime dtTo = DateTime.Parse(dtToString); TimeSpan timeSpan = dtTo - dtFrom; return (int)timeSpan.TotalSeconds; } /// /// 得到两个日期时间之间相差的毫秒数 /// /// 起始日期时间 /// 终止日期时间 /// 相差的毫秒数 public static int MilliSecondsAfter(string dtFromString, string dtToString) { DateTime dtFrom = DateTime.Parse(dtFromString); DateTime dtTo = DateTime.Parse(dtToString); TimeSpan timeSpan = dtTo - dtFrom; return (int)timeSpan.TotalMilliseconds; } /// /// 通过时、分、秒得到时间串 /// /// 小时 /// 分钟 /// 秒 /// 时间部分 public static string EncodeTime(int nHour, int nMinute, int nSecond) { string sResult = nHour.ToString("00") + ":" + nMinute.ToString("00") + ":" + nSecond.ToString("00"); return sResult; } /// /// 通过年、月、日得到日期部分 /// /// 年份 /// 月份 /// 日 /// 日期部分 public static string EncodeDate(int nYear, int nMonth, int nDay) { string sResult = nYear.ToString("0000") + "-" + nMonth.ToString("00") + "-" + nDay.ToString("00"); return sResult; } /// /// 得到日期部分 /// /// 日期时间 /// 日期部分 public static string GetDatePart(string sDatetime) { if (sDatetime.Length < 10) return ""; return sDatetime.Substring(0, 10); } /// /// 得到时间部分 /// /// 日期时间 /// 时间部分 public static string GetTimePart(string sDatetime) { if (sDatetime.Length == 19) return sDatetime.Substring(11, 8); else return "00:00:00"; } /// /// 得到一天的起始时间 /// /// 日期 /// 起始时间 public static string BeginTimeOfDay(string sDate) { if (sDate.Length > 10) sDate = sDate.Substring(0, 10); return sDate + " 00:00:00"; } /// /// 得到一天的结束时间 /// /// 日期 /// 结束时间 public static string EndTimeOfDay(string sDate) { if (sDate.Length > 10) sDate = sDate.Substring(0, 10); return sDate + " 23:59:59.999"; } /// /// 由19位的日期时间转到14位的日期时间 /// /// 19位的日期时间 /// 14位的日期时间 public static string ToDateTime14Str(string sDT) { if (sDT == "") return ""; if (sDT.Length != 19) throw new Exception("DateTimeUtil.ToDateTime14Str() error : 参数不是19位"); string sRet = sDT.Replace(":", "").Replace("-", "").Replace(" ", ""); if (sRet.Length != 14) throw new Exception("DateTimeUtil.ToDateTime14Str() error : 返回值不是14位"); return sRet; } /// /// 由14位的日期时间转到19位的日期时间 /// /// 14位的日期时间 /// 19位的日期时间 public static string FromDateTime14Str(string sDT14) { if (sDT14 == "") return ""; if (sDT14.Length != 14) throw new Exception("DateTimeUtil.FromDateTime14Str() error : 参数不是14位"); string sRet = sDT14.Substring(0, 4) + "-" + sDT14.Substring(4, 2) + "-" + sDT14.Substring(6, 2) + " " + sDT14.Substring(8, 2) + ":" + sDT14.Substring(10, 2) + ":" + sDT14.Substring(12, 2); return sRet; } public static double GetTimeDifferenceInSeconds( DateTime end,DateTime start) { // 获取时间差 TimeSpan timeDifference = end - start; // 返回时间差的总秒数 return timeDifference.TotalSeconds; } /// /// 时间转换逻辑 /// 当前时间是的0~1小时返回2小时 ,当前时间是的1 ~2小时返回3小时 ,如此类推,当前时间是的21 ~22小时返回23小时 ,当前时间是的23 ~0小时返回次日1小时 /// /// 当前消息 /// public static int GetNextHour(int currentHour) { // 处理 23 点特殊情况 if (currentHour == 23) { return 1; // 23点到0点时,返回次日1小时 } // 处理 22 点特殊情况 if (currentHour == 22) { return 0; // 22点到23点时,返回次日0小时 } // 计算其他时间的返回值 return (int)((Math.Round(currentHour / 2.0, 1) + 1) * 2); } ///// ///// 是否为日期型字符串 ///// ///// 日期字符串(2008-05-08) ///// //public static bool IsDate(string StrSource) //{ // return Regex.IsMatch(StrSource, @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-9]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$"); //} } }