zoukankan      html  css  js  c++  java
  • 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

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

    郑重声明:本博客仅用于个人整理和总结学习笔记,如有任何疑问欢迎留言!
  • 相关阅读:
    【medium】78. Subsets
    【easy】784. Letter Case Permutation
    【easy】671. Second Minimum Node In a Binary Tree
    【easy】Number of Segments in a String 字符串中的分段数量
    【easy】268. Missing Number
    【easy】235. Lowest Common Ancestor of a Binary Search Tree
    【easy】198. House Robber 123总结……
    【easy】438.Find All Anagrams in a String 找出字符串中所有的变位词
    【easy-】437. Path Sum III 二叉树任意起始区间和
    【easy】437. Path Sum III 二叉树任意起始区间和
  • 原文地址:https://www.cnblogs.com/WeiGe/p/3318195.html
Copyright © 2011-2022 走看看