C#时间的味道——任时光匆匆我只在乎你
如果没有遇见你,我将会是在哪里?日子过的怎么样人生是否要珍惜...任时光匆匆我只在乎你,心甘情愿感染你的气息,人生几何能得到知己...一首邓丽君的《我只在乎你》不禁令我唏嘘不已,这些年离我们而去的还有哥哥张国荣,我们忘不了他那忧郁的眼神,偶尔也会怀念家驹,每当心里难过的时候,那首《海阔天空》总能让我找到活着的意义,当然了还有乔布斯,他比我们更了解时间的意义,时间是一把无情刻刀,改变了我们的模样,也改变了这个世界,听着这些歌,我们的思绪仿佛回到了过去,回到了童年,怀念一些人和一些事,这就是时间存在的意义。
即便在程序的世界里也依然如此,因为时间从没有离开过我们,我们总能品尝到时间的味道,这不在C#里就有一个主管时间的大神——DateTime,聊聊它呗!
编码的时候有没有经常遇到时间的问题,比如时不时用时间作为查询的条件,获取系统的时间等等,时间这东西,谁用谁知道!
1、我们先看看在输出的占位符里边怎样控制日期的格式,啥也不说,来点干货
#region 在输出的占位符里边控制时间的格式 DateTime dateTime = DateTime.Now; Console.WriteLine("d = {0:d}", dateTime); Console.WriteLine("D = {0:D}", dateTime); Console.WriteLine("f = {0:f}", dateTime); Console.WriteLine("F = {0:F}", dateTime); Console.WriteLine("g = {0:g}", dateTime); Console.WriteLine("G = {0:G}", dateTime); Console.WriteLine("M = {0:M}", dateTime); Console.WriteLine("R = {0:R}", dateTime); Console.WriteLine("s = {0:s}", dateTime); Console.WriteLine("t = {0:t}", dateTime); Console.WriteLine("T = {0:T}", dateTime); Console.WriteLine("u = {0:u}", dateTime); Console.WriteLine("U = {0:U}", dateTime); Console.WriteLine("Y = {0:Y}", dateTime); Console.WriteLine("Month = " + dateTime.Month); Console.WriteLine("Day Of Week = " + dateTime.DayOfWeek); Console.WriteLine("Time Of Day = " + dateTime.TimeOfDay); Console.WriteLine("DateTime.Ticks = " + dateTime.Ticks); #endregion
效果图如下:
2、取得月的第一天和最后一天,不解释,直接上例子
1./// <summary> 2./// 取得某月的第一天 3./// </summary> 4./// <param name="datetime">要取得月份第一天的时间</param> 5./// <returns></returns> 6.private DateTime FirstDayOfMonth(DateTime datetime) 7.{ 8.return datetime.AddDays(1 - datetime.Day); 9.} 10. 11./**//// <summary> 12./// 取得某月的最后一天 13./// </summary> 14./// <param name="datetime">要取得月份最后一天的时间</param> 15./// <returns></returns> 16.private DateTime LastDayOfMonth(DateTime datetime) 17. 18.return datetime.AddDays(1 - datetime.Day).AddMonths(1).AddDays(-1); 19.} 20. 21./**//// <summary> 22./// 取得上个月第一天 23./// </summary> 24./// <param name="datetime">要取得上个月第一天的当前时间</param> 25./// <returns></returns> 26.private DateTime FirstDayOfPreviousMonth(DateTime datetime) 27.{ 28.return datetime.AddDays(1 - datetime.Day).AddMonths(-1); 29.} 30. 31./**//// <summary> 32./// 取得上个月的最后一天 33./// </summary> 34./// <param name="datetime">要取得上个月最后一天的当前时间</param> 35./// <returns></returns> 36.private DateTime LastDayOfPrdviousMonth(DateTime datetime) 37.{ 38.return datetime.AddDays(1 - datetime.Day).AddDays(-1); 39.}
3、换做tostring()方式输出也可以,只要传入相关的格式控制符即可,直接上例子
#region 用tostring的方式显示格式 String[] format = { "d", "D", "f", "F", "g", "G", "m", "r", "s", "t", "T", "u", "U", "y", "dddd, MMMM dd yyyy", "ddd, MMM d \"'\"yy", "dddd, MMMM dd", "M/yy", "dd-MM-yy", }; String date; for (int i = 0; i < format.Length; i++) { date = dateTime.ToString(format[i], DateTimeFormatInfo.InvariantInfo); Console.WriteLine(String.Concat(format[i], " :", date)); } #endregion
效果图如下:
4、时间差的计算,使用TimeSpan就ok了,TimeSpan有很多属性,可以在网上查到,这里举个小例子,说明其常规用法
DateTime d1 =new DateTime(2013,8,1,15,36,05); DateTime d2 =new DateTime(2013,9,12,20,16,35); TimeSpan d3 = d2.Subtract(d1); LblTime.Text = "相差:" +d3.Days.ToString()+"天" +d3.Hours.ToString()+"小时" +d3.Minutes.ToString()+"分钟" +d3.Seconds.ToString()+"秒";
5、怎样知道某一年的某月有多少天呢?呵呵,so easy,瞬间搞定
int days = DateTime.DaysInMonth(2013, 8); //days = 31;
6、在用时间区间做查询时,记得要用>=和<=,这样查询才不会少算
strStartDate = TexTimeStart.Text.Trim() + " 00:00:00"; strEndDate = TexTimeEnd.Text.Trim() + " 23:59:59"; //查询用的sql语句中时间区间的处理 string strSql = "select HSP_HotelID,HSP_UserName,HSP_ReturnVisitTime,ValidForceName from HSP_ReturnVisit where HSP_ReturnVisitTime >= '" + start + "' and HSP_ReturnVisitTime <= '" + end + "'";
7、今天昨天还有明天
//今天 DateTime.Now.Date.ToShortDateString(); //昨天:今天的日期减1 DateTime.Now.AddDays(-1).ToShortDateString(); //明天:今天的日期加1 DateTime.Now.AddDays(1).ToShortDateString();
8、本周上周还有下周
//本周(要知道本周的第一天就得先知道今天是星期几,从而得知本周的第一天就是几天前的那一天,要注意的是这里的每一周是从周日始至周六止 DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek)))).ToShortDateString(); DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek)))).ToShortDateString(); //如果你还不明白,再看一下中文显示星期几的方法就应该懂了 //由于DayOfWeek返回的是数字的星期几,我们要把它转换成汉字方便我们阅读,有些人可能会用switch来一个一个地对照,其实不用那么麻烦的 string[] Day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; Day[Convert.ToInt16(DateTime.Now.DayOfWeek)];
//上周,同理,一个周是7天,上周就是本周再减去7天,下周也是一样 DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek))) - 7).ToShortDateString(); DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek))) - 7).ToShortDateString(); //下周 DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek))) + 7).ToShortDateString(); DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek))) + 7).ToShortDateString();
9、本月上个月还有下个月
//本月,很多人都会说本月的第一天嘛肯定是1号,最后一天就是下个月一号再减一天。当然这是对的
//一般的写法 DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + "1"; //第一天 DateTime.Parse(DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + "1").AddMonths(1).AddDays(-1).ToShortDateString();//最后一天 //巧用C#里ToString的字符格式化更简便 DateTime.Now.ToString("yyyy-MM-01"); DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).AddDays(-1).ToShortDateString();
//上个月,减去一个月份 DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(-1).ToShortDateString(); DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();
//下个月,加去一个月份 DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).ToShortDateString(); DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(2).AddDays(-1).ToShortDateString();
10、七天后、七天前
//7天后 DateTime.Now.Date.ToShortDateString(); DateTime.Now.AddDays(7).ToShortDateString(); //7天前 DateTime.Now.AddDays(-7).ToShortDateString(); DateTime.Now.Date.ToShortDateString();
11、本年度、上年度、下年度
//本年度,用ToString的字符格式化我们也很容易地算出本年度的第一天和最后一天 DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).ToShortDateString(); DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).AddDays(-1).ToShortDateString(); //上年度,不用再解释了吧 DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(-1).ToShortDateString(); DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddDays(-1).ToShortDateString(); //下年度 DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).ToShortDateString(); DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(2).AddDays(-1).ToShortDateString();
12、本季度、上季度、下季度
//本季度,很多人都会觉得这里难点,需要写个长长的过程来判断。其实不用的,我们都知道一年四个季度,一个季度三个月 //首先我们先把日期推到本季度第一个月,然后这个月的第一天就是本季度的第一天了 DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01"); //同理,本季度的最后一天就是下季度的第一天减一 DateTime.Parse(DateTime.Now.AddMonths(3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString(); //下季度 DateTime.Now.AddMonths(3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01"); DateTime.Parse(DateTime.Now.AddMonths(6 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString(); //上季度 DateTime.Now.AddMonths(-3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01"); DateTime.Parse(DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();
13、各种格式的时间处理,你可以在里边找找有没有你想要的东东
#region 各种格式的时间输出 DateTime dt = new DateTime(2012, 10, 5); dt.ToString();//2012-10-5 13:21:25 dt.ToFileTime().ToString();//127756416859912816 dt.ToFileTimeUtc().ToString();//127756704859912816 dt.ToLocalTime().ToString();//2012-10-5 21:21:25 dt.ToLongDateString().ToString();//2012年10月5日 dt.ToLongTimeString().ToString();//13:21:25 dt.ToOADate().ToString();//38661.5565508218 dt.ToShortDateString().ToString();//2012-10-5 dt.ToShortTimeString().ToString();//13:21 dt.ToUniversalTime().ToString();//2012-10-5 5:21:25 dt.Year.ToString();//2012 dt.Date.ToString();//2012-10-5 0:00:00 dt.DayOfWeek.ToString();//Saturday dt.DayOfYear.ToString();//309 dt.Hour.ToString();//13 dt.Millisecond.ToString();//441 dt.Minute.ToString();//30 dt.Month.ToString();//10 dt.Second.ToString();//28 dt.Ticks.ToString();//632667942284412864 dt.TimeOfDay.ToString();//13:30:28.4412864 dt.ToString();//2012-10-5 13:47:04 dt.AddYears(1).ToString();//2006-10-5 13:47:04 dt.AddDays(1.1).ToString();//2012-10-6 16:10:04 dt.AddHours(1.1).ToString();//2012-10-5 14:53:04 dt.AddMilliseconds(1.1).ToString();//2012-10-5 13:47:04 dt.AddMonths(1).ToString();//2012-12-5 13:47:04 dt.AddSeconds(1.1).ToString();//2012-10-5 13:47:05 dt.AddMinutes(1.1).ToString();//2012-10-5 13:48:10 dt.AddTicks(1000).ToString();//2012-10-5 13:47:04 dt.CompareTo(dt).ToString();//0 //dt.Add(?).ToString();//问号为一个时间段 dt.Equals("2012-10-6 16:10:04").ToString();//False dt.Equals(dt).ToString();//True dt.GetHashCode().ToString();//1474088234 dt.GetType().ToString();//System.DateTime dt.GetTypeCode().ToString();//DateTime dt.GetDateTimeFormats('s')[0].ToString();//2012-10-05T14:06:25 dt.GetDateTimeFormats('t')[0].ToString();//14:06 dt.GetDateTimeFormats('y')[0].ToString();//2012年10月 dt.GetDateTimeFormats('D')[0].ToString();//2012年10月5日 dt.GetDateTimeFormats('D')[1].ToString();//2012 10 05 dt.GetDateTimeFormats('D')[2].ToString();//星期六 2012 10 05 dt.GetDateTimeFormats('D')[3].ToString();//星期六 2012年10月5日 dt.GetDateTimeFormats('M')[0].ToString();//10月5日 dt.GetDateTimeFormats('f')[0].ToString();//2012年10月5日 14:06 dt.GetDateTimeFormats('g')[0].ToString();//2012-10-5 14:06 dt.GetDateTimeFormats('r')[0].ToString();//Sat, 05 Nov 2012 14:06:25 GMT string.Format("{0:d}", dt);//2012-10-5 string.Format("{0:D}", dt);//2012年10月5日 string.Format("{0:f}", dt);//2012年10月5日 14:23 string.Format("{0:F}", dt);//2012年10月5日 14:23:23 string.Format("{0:g}", dt);//2012-10-5 14:23 string.Format("{0:G}", dt);//2012-10-5 14:23:23 string.Format("{0:M}", dt);//10月5日 string.Format("{0:R}", dt);//Sat, 05 Nov 2012 14:23:23 GMT string.Format("{0:s}", dt);//2012-10-05T14:23:23 string.Format("{0:t}", dt);//14:23 string.Format("{0:T}", dt);//14:23:23 string.Format("{0:u}", dt);//2012-10-05 14:23:23Z string.Format("{0:U}", dt);//2012年10月5日 6:23:23 string.Format("{0:Y}", dt);//2012年10月 string.Format("{0}", dt);//2012-10-5 14:23:23 string.Format("{0:yyyyMMddHHmmssffff}", dt); #endregion
以上其实都比较基础,如果能够把他们封装成一个时间帮助类最好,这个就能够在程序里复用了,以后有时间了整理一下,时间是个严谨的东西,我呢,也只是整理一下而已,知识呢都是无止境的,这里只不过是学习过程中的一点点心得,只希望自己能够每天成长一点点!
另外,再说点题外话,时间对程序猿是很宝贵的,因为我们中国的特色,所以我们不可能一辈子写程序,所以趁着年轻就好好写两年程序,之后再给自己留个后路,做好职业规划,规划好人生的时间,别经常熬夜,以后日子就不会像现在一样苦逼了!
郑重声明:本博客仅用于个人整理和总结学习笔记,如有任何疑问欢迎留言!