/******************************************************************************* * Copyright(c) 2012 dongke All rights reserved. / Confidential * 类的信息: * 1.程序名称:DateTimeManager.cs * 2.功能描述:提供跟DateTime相关的功能,例如:字符转日期,日期转字符等 * 编辑履历: * 作者 日期 版本 修改内容 * 欧阳涛 2012/06/07 1.00 新建 *******************************************************************************/ using System; using System.Text.RegularExpressions; namespace Dongke.IBOSS.PRD.Basics.Library { /// /// 提供跟DateTime相关的功能,例如:字符转日期,日期转字符等 /// public class DateTimeManager { #region 常量定义 /// /// 日期格式的字符串格式数组
///
/// 格式
///  ・YYYY:年(公历、4位数字)
///  ・YY :年(公历、4位数字)
///  ・MMM:月(JAN/FEB/MAR/APR/MAY/JUN/JUL/AUG/SEP/OCT/NOV/DEC)
///  ・MM :月(2位数字)
///  ・M :月(可变位数数字)
///  ・DD:日(2位数字)
///  ・D :日(可变位数数字)
///
///  ・[ ] :空字符串
///  ・[/] :区分字符串(分隔符)
///
private static string[] FORMAT_LIST_FOR_DATE = new string[] { "YYYY_/_MM_/_DD", "YYYY_/_MM_/_D", "YYYY_/_M_/_DD", "YYYY_/_M_/_D", "YY_/_MM_/_DD", "YY_/_MM_/_D", "YY_/_M_/_DD", "YY_/_M_/_D", "MM_/_DD", "MM_/_D", "M_/_DD", "M_/_D", "YYYY_MM_DD", "YY_MM_DD", "MM_DD", "DD_/_MMM_/_YYYY", "DD_/_MMM_/_YY", "DD_/_MMM", "DD_MMM_YYYY", "DD_MMM_YY", "DD_MMM", "YYYY_/_MM" }; /// /// 时间格式的字符串格式数组
///
/// 格式
///  ・hh :小时(2位数字)
///  ・h :小时(可变位数数字)
///  ・mm :分钟(2位数字)
///  ・m :分钟(可变位数数字)
///  ・ss :秒(2位数字)
///  ・s :秒(可变位数数字)
///
///  ・[ ] :空字符串
///  ・[/] :区分字符串(分隔符)
///
private static string[] FORMAT_LIST_FOR_TIME = new string[] { "hh_mm", "h_mm", "hh_/_mm", "hh_/_m", "h_/_mm", "h_/_m", "hh_/_mm_/_ss", "hh_/_mm_/_s", "hh_/_m_/_ss", "hh_/_m_/_s", "h_/_mm_/_ss", "h_/_mm_/_s", "h_/_m_/_ss", "h_/_m_/_s" }; /// /// 日期和时间的字符串数组 /// private static string[][] FORMAT_LIST = new string[][] { FORMAT_LIST_FOR_DATE, FORMAT_LIST_FOR_TIME }; /// /// 英文月的数组 /// private static string[] EMONTH_LIST = new string[] { "January", "Febuary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", }; /// /// 英文星期数组 /// private static string[] EWDAY_LIST = new string[] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", }; /// /// 中文星期数组 /// private static string[] CWDAY_LIST = new string[] { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日", }; #endregion #region 枚举 /// /// 日期的种类 /// private enum DateItemType { /// /// 年 /// Year, /// /// 月 /// Month, /// /// 日 /// Day, /// /// 星期 /// DayOfWeek, /// /// 小时 /// Hour, /// /// 分钟 /// Minute, /// /// 秒 /// Second, /// /// 毫秒 /// Millisecond } #endregion #region 公开方法/函数 #region DateTime /// /// 取得当月第一天 /// /// /// public static DateTime GetFirstDateInMonth(DateTime date) { return date.AddDays(1 - date.Day); } /// /// 取得该月的最后一天 /// /// /// public static DateTime GetLastDateInMonth(DateTime date) { DateTime firstDate = GetFirstDateInMonth(date); return firstDate.AddMonths(1).AddDays(-1); } /// /// 取得本周的第一天的日期 /// /// 日期 /// 星期的第一天是星期几,周一或者周日 /// public static DateTime GetFirstDateInWeek(DateTime date, DayOfWeek firstDayOfWeek) { int diffNum = ((int)(date.DayOfWeek - firstDayOfWeek) + 7) % 7; return date.AddDays(-1 * diffNum); } /// /// 取得本周的最后一天的日期 /// /// 日期 /// 星期的第一天是星期几,周一或者周日 /// public static DateTime GetLastDateInWeek(DateTime date, DayOfWeek firstDayOfWeek) { int diffNum = ((int)(date.DayOfWeek - firstDayOfWeek) + 7) % 7; return date.AddDays(7 - diffNum - 1); } /// /// 取得本年中的周数 /// /// 日期 /// 星期的第一天是星期几,周一或者周日 /// public static int GetWeekNumberInYear(DateTime date, DayOfWeek firstDayOfWeek) { return (GetLastDateInWeek(date, firstDayOfWeek).DayOfYear - 1) / 7 + 1; } #endregion #region 字符串转换成日期 /// /// 字符串转换成日期 /// /// 需要转换成日期的字符串 /// 返回转换后的日期 /// /// True:转换成功 /// False:转换错误 /// public static bool ConvertDateTime(string dateTimeString, out DateTime dateTime) { return ConvertDateTime(dateTimeString, null, out dateTime); } /// /// 字符串转换成日期 /// /// /// /// 返回转换后的日期,转换失败的情况下,返回DateTime.MinValue /// /// True:转换成功 /// False:转换错误 /// public static bool ConvertDateTime(string dateTimeString, string[] parseList, out DateTime dateTime) { if (string.IsNullOrEmpty(dateTimeString)) { dateTime = DateTime.MinValue; return false; } string parseFormat = GetDateTimeParseFormat(dateTimeString, parseList); if (string.IsNullOrEmpty(parseFormat)) { dateTime = DateTime.MinValue; return false; } dateTimeString = ConvertDelimiter(dateTimeString); string yearStr, month, day, hour, minute, second; yearStr = ExtractSubstring(dateTimeString, parseFormat, string.Empty, "YYYY", "YY"); if (yearStr.Length == 2) { // 西历的年是2位的情况,需要自动补充完整 string paramYearUnderStr = yearStr; int nParamYearUnder = int.Parse(paramYearUnderStr); // 现在系统的时间 string curYearStr; curYearStr = DateTime.Today.Year.ToString(); int curYearUpper = int.Parse(curYearStr.Substring(0, 2)); int curYearUnder = int.Parse(curYearStr.Substring(2, 2)); int border = curYearUnder - 50; int year1, year2; if (border < 0) { // 当前西历是上半年的情况 border = curYearUnder + 50; year1 = curYearUpper; year2 = curYearUpper - 1; } else { // 当前西历是是下半年的情况 year1 = curYearUpper + 1; year2 = curYearUpper; } string tmpStr; tmpStr = ((nParamYearUnder <= border) ? year1 : year2).ToString(); tmpStr += paramYearUnderStr; yearStr = tmpStr; } // 月 month = ExtractSubstring(dateTimeString, parseFormat, "1", "MMM", "MM", "M"); if (month.Length == 3) { // [JAN/FEB/...]的情况 month = ConvertValue(EMONTH_LIST, month); } // 日 day = ExtractSubstring(dateTimeString, parseFormat, "1", "DD", "D"); // 小时 hour = ExtractSubstring(dateTimeString, parseFormat, "0", "hh", "h"); // 分钟 minute = ExtractSubstring(dateTimeString, parseFormat, "0", "mm", "m"); // 秒 second = ExtractSubstring(dateTimeString, parseFormat, "0", "ss", "s"); bool isFindYear = true; if (string.IsNullOrEmpty(yearStr)) { // 是不是能够找到年度 isFindYear = false; // 用当前年度设定 yearStr = DateTime.Today.Year.ToString(); } try { // 向日期类型进行转换 DateTime tmp = DateTime.MinValue; if (DateTime.TryParse(string.Format("{0}/{1}/{2} {3}:{4}:{5}", yearStr, month, day, hour, minute, second), out tmp)) { dateTime = tmp; } else { dateTime = DateTime.MinValue; return false; } } catch (Exception) { dateTime = DateTime.MinValue; return false; } if (isFindYear == false) { if (dateTime < DateTime.Today) { dateTime = dateTime.AddYears(1); } } return true; } #endregion #region 日期转换成字符串 public static string ConvertString(DateTime source, string format) { string result = format; // 日期·时间的变量初始化 string year = string.Format("{0:0000}", source.Year); string month = string.Format("{0:00}", source.Month); string day = string.Format("{0:00}", source.Day); string hour = string.Format("{0:00}", source.Hour); string minute = string.Format("{0:00}", source.Minute); string second = string.Format("{0:00}", source.Second); // 向指定格式的数据进行转换 result.Replace("YYYY", year); result.Replace("YY", year.Substring(2, 2)); result.Replace("MMM", EMONTH_LIST[int.Parse(TrimLeftZero(month)) - 1].Substring(0, 3).ToUpper()); result.Replace("MM", month); result.Replace("M", TrimLeftZero(month)); result.Replace("DD", day); result.Replace("D", TrimLeftZero(day)); result.Replace("hh", hour); result.Replace("h", TrimLeftZero(hour)); result.Replace("mm", minute); result.Replace("m", TrimLeftZero(minute)); result.Replace("ss", second); result.Replace("s", TrimLeftZero(second)); result.Replace("ddd", EWDAY_LIST[(source.DayOfWeek - DayOfWeek.Sunday) - 1].Substring(0, 3).ToUpper()); result.Replace("dd", EWDAY_LIST[(source.DayOfWeek - DayOfWeek.Sunday) - 1].Substring(0, 2).ToUpper()); result.Replace("jjj", CWDAY_LIST[(source.DayOfWeek - DayOfWeek.Sunday) - 1]); result.Replace("j", CWDAY_LIST[(source.DayOfWeek - DayOfWeek.Sunday) - 1].Substring(0, 1)); return result; } #endregion #region 年龄·月龄计算 /// /// 计算年龄 /// /// 生日 /// 计算日期 /// public static int CalcAge(DateTime birthDate, DateTime baseDate) { // 基本年龄 int age = baseDate.Year - birthDate.Year; // 当年的生日 DateTime thisYearBirthDate = birthDate.AddYears(age); // 生日前判断 if (baseDate < thisYearBirthDate) { age--; } return age; } /// /// 计算月龄 /// /// 生日 /// 计算日期 /// public static int CalcAgeMonth(DateTime birthDate, DateTime baseDate) { // 基本月龄 int ageMonth = (baseDate.Year - birthDate.Year) * 12 + (baseDate.Month - birthDate.Month); // 生日前判断 if (baseDate.Day < birthDate.Day) { ageMonth--; } return ageMonth; } #endregion #endregion #region 私有函数/方法 /// /// 指定的字符串按照规定的格式要求转换成日期格式 /// /// /// /// private static string GetDateTimeParseFormat(string dateTime, string[] formatList) { dateTime = ConvertDelimiter(dateTime); if (formatList == null) { System.Collections.Generic.List list = new System.Collections.Generic.List(); foreach (string format in FORMAT_LIST_FOR_DATE) { list.Add(format); } foreach (string format in FORMAT_LIST_FOR_TIME) { list.Add(format); } foreach (string formatDate in FORMAT_LIST_FOR_DATE) { foreach (string formatTime in FORMAT_LIST_FOR_TIME) { list.Add(string.Format("{0}_ _{1}", formatDate, formatTime)); } } formatList = list.ToArray(); } int start, end, checkNum; bool isMatch; string formatTemp, item, type; string parseFormat = null; for (int i = 0; i < formatList.Length; i++) { formatTemp = formatList[i]; formatTemp = formatTemp.Replace("_", string.Empty); if (formatTemp.Length != dateTime.Length) { continue; } formatTemp = formatList[i]; start = end = checkNum = 0; isMatch = true; while (0 <= end) { end = formatTemp.IndexOf("_", end); if (0 <= end) { item = dateTime.Substring(start - checkNum, end - start); type = formatTemp.Substring(start, end - start); } else { item = dateTime.Substring(start - checkNum); type = formatTemp.Substring(start); } if (!CheckItem(item, type)) { isMatch = false; break; } if (end < 0) { break; } checkNum++; start = ++end; } if (isMatch) { parseFormat = formatTemp; break; } } if (string.IsNullOrEmpty(parseFormat)) { // 不可识别的情况 return null; } else { // 取得显示的格式 return parseFormat.Replace("_", string.Empty); } } /// /// 分隔符替换 /// /// /// private static string ConvertDelimiter(string dateTime) { return Regex.Replace(dateTime, "[^A-Za-z0-9_ ]", "/"); } /// /// /// /// /// /// private static string ConvertValue(string[] list, string value) { if (string.IsNullOrEmpty(value)) { return null; } int length = value.Length; for (int i = 0; i < list.Length; i++) { if (value.Equals(list[i].Substring(0, length), StringComparison.InvariantCultureIgnoreCase)) { return string.Format("{0:00}", i + 1); } } return null; } /// /// 字符串的值是不是该种类的检查 /// /// /// /// private static bool CheckItem(string item, string type) { if ("/".CompareTo(type) == 0) { // 有日期分隔符的情况 if ("/".CompareTo(item) == 0) { return true; } else { return false; } } else if (" ".CompareTo(type) == 0) { // 空字符串的情况 if (" ".CompareTo(item) == 0) { return true; } else { return false; } } else if ("MMM".CompareTo(type) == 0) { // [JAN/FEB/...]格式的情况 return !string.IsNullOrEmpty(ConvertValue(EMONTH_LIST, item)); } else { // 月份是通常数字的情况 if (type.Length != item.Length) { return false; } int result; return int.TryParse(item, out result); } } /// /// 提取该字符串 /// /// /// /// /// /// private static string ExtractSubstring(string dateTimeString, string parseFormat, string defaultValue, params string[] findList) { int index; foreach (string find in findList) { if ((index = parseFormat.IndexOf(find)) != -1) { return dateTimeString.Substring(index, find.Length); } } return defaultValue; } /// /// 左边用零补齐 /// /// /// private static string TrimLeftZero(string value) { if (string.IsNullOrEmpty(value)) { return value; } return value.TrimStart(new char[] { '0' }); } #endregion } }