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
View Code

以上其实都比较基础,如果能够把他们封装成一个时间帮助类最好,这个就能够在程序里复用了,以后有时间了整理一下,时间是个严谨的东西,我呢,也只是整理一下而已,知识呢都是无止境的,这里只不过是学习过程中的一点点心得,只希望自己能够每天成长一点点!
另外,再说点题外话,时间对程序猿是很宝贵的,因为我们中国的特色,所以我们不可能一辈子写程序,所以趁着年轻就好好写两年程序,之后再给自己留个后路,做好职业规划,规划好人生的时间,别经常熬夜,以后日子就不会像现在一样苦逼了!

 

posted @ 2013-09-12 23:10  掉进书洞里的猫  阅读(911)  评论(0编辑  收藏  举报