C# 根據當前時間獲取,本週,本月,本季度等時間段 .Net中Exception

 

DateTime dt = DateTime.Now;  //當前時間

DateTime startWeek
= dt.AddDays(1 - Convert.ToInt32(dt.DayOfWeek.ToString("d")));  //本週週一

DateTime endWeek = startWeek.AddDays(6);  //本週週日

DateTime startMonth
= dt.AddDays(1 - dt.Day);  //本月月初

DateTime endMonth = startMonth.AddMonths(1).AddDays(-1);  //本月月末
//DateTime endMonth = startMonth.AddDays((dt.AddMonths(1) - dt).Days - 1);  //本月月末


DateTime startQuarter
= dt.AddMonths(0 - (dt.Month - 1) % 3).AddDays(1 - dt.Day);  //本季度初

DateTime endQuarter = startQuarter.AddMonths(3).AddDays(-1);  //本季度末

DateTime startYear
= new DateTime(dt.Year, 1, 1);  //本年年初

DateTime endYear = new DateTime(dt.Year, 12, 31);  //本年年末

至於昨天、明天、上週、上月、上季度、上年度等等,只要AddDays()、AddMonths()、AddYears()這幾種方法組合一下就可以了。
C#中datetime的使用
//
如果你還不明白,再看一下中文顯示星期幾的方法就應該懂了
//由於DayOfWeek返回的是數字的星期幾,我們要把它轉換成漢字方便我們閱讀,有些人可能會用switch來一個一個地對照,其實不用那麼麻煩的

string[] Day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
string week = Day[Convert.ToInt32(DateTime.Now.DayOfWeek.ToString("d"
))].ToString();

//上週,同理,一個周是7天,上週就是本週再減去7天,下週也是一樣

DateTime.Now.AddDays(Convert.ToInt32 (1 - Convert.ToInt32(DateTime.Now.DayOfWeek)) - 7);        //上週一
DateTime.Now.AddDays(Convert.ToInt32 (1 - Convert.ToInt32(DateTime.Now.DayOfWeek)) - 7).AddDays(6);     //上週末(星期日)
//下週

DateTime.Now.AddDays(Convert.ToInt32 (1 - Convert.ToInt32(DateTime.Now.DayOfWeek)) + 7);        //下週一
DateTime.Now.AddDays(Convert.ToInt32(1 - Convert.ToInt32(DateTime.Now.DayOfWeek)) + 7).AddDays(6);      //下週末
//
本月,很多人都會說本月的第一天嘛肯定是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();
//7天后

DateTime.Now.Date.ToShortDateString();
DateTime.Now.AddDays(
7
).ToShortDateString();
//7天前

DateTime.Now.AddDays(-7).ToShortDateString();
DateTime.Now.Date.ToShortDateString();

//本年度,用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();

//
本季度,很多人都會覺得這裏難點,需要寫個長長的過程來判斷。其實不用的,我們都知道一年四個季度,一個季度三個月
//首先我們先把日期推到本季度第一個月,然後這個月的第一天就是本季度的第一天了

DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).AddDays(1 - DateTime.Now.Day);
//同理,本季度的最後一天就是下季度的第一天減一

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)). AddDays(1 - DateTime.Now);
DateTime.Now.AddMonths(
0 - ((DateTime.Now.Month - 1) % 3)).AddDays(1 - DateTime.Now.Day).AddDays(-1
).ToShortDateString();

DateTime dt = DateTime.Now;  //當前時間

DateTime startWeek
= dt.AddDays(1 - Convert.ToInt32(dt.DayOfWeek.ToString("d")));  //本週週一

DateTime endWeek = startWeek.AddDays(6);  //本週週日

DateTime startMonth
= dt.AddDays(1 - dt.Day);  //本月月初

DateTime endMonth = startMonth.AddMonths(1).AddDays(-1);  //本月月末
//DateTime endMonth = startMonth.AddDays((dt.AddMonths(1) - dt).Days - 1);  //本月月末


DateTime startQuarter
= dt.AddMonths(0 - (dt.Month - 1) % 3).AddDays(1 - dt.Day);  //本季度初

DateTime endQuarter = startQuarter.AddMonths(3).AddDays(-1);  //本季度末

DateTime startYear
= new DateTime(dt.Year, 1, 1);  //本年年初

DateTime endYear = new DateTime(dt.Year, 12, 31);  //本年年末

至於昨天、明天、上週、上月、上季度、上年度等等,只要AddDays()、AddMonths()、AddYears()這幾種方法組合一下就可以了。
C#中datetime的使用
//
如果你還不明白,再看一下中文顯示星期幾的方法就應該懂了
//由於DayOfWeek返回的是數字的星期幾,我們要把它轉換成漢字方便我們閱讀,有些人可能會用switch來一個一個地對照,其實不用那麼麻煩的

string[] Day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
string week = Day[Convert.ToInt32(DateTime.Now.DayOfWeek.ToString("d"
))].ToString();

//上週,同理,一個周是7天,上週就是本週再減去7天,下週也是一樣

DateTime.Now.AddDays(Convert.ToInt32 (1 - Convert.ToInt32(DateTime.Now.DayOfWeek)) - 7);        //上週一
DateTime.Now.AddDays(Convert.ToInt32 (1 - Convert.ToInt32(DateTime.Now.DayOfWeek)) - 7).AddDays(6);     //上週末(星期日)
//下週

DateTime.Now.AddDays(Convert.ToInt32 (1 - Convert.ToInt32(DateTime.Now.DayOfWeek)) + 7);        //下週一
DateTime.Now.AddDays(Convert.ToInt32(1 - Convert.ToInt32(DateTime.Now.DayOfWeek)) + 7).AddDays(6);      //下週末
//
本月,很多人都會說本月的第一天嘛肯定是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();
//7天后

DateTime.Now.Date.ToShortDateString();
DateTime.Now.AddDays(
7
).ToShortDateString();
//7天前

DateTime.Now.AddDays(-7).ToShortDateString();
DateTime.Now.Date.ToShortDateString();

//本年度,用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();

//
本季度,很多人都會覺得這裏難點,需要寫個長長的過程來判斷。其實不用的,我們都知道一年四個季度,一個季度三個月
//首先我們先把日期推到本季度第一個月,然後這個月的第一天就是本季度的第一天了

DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).AddDays(1 - DateTime.Now.Day);
//同理,本季度的最後一天就是下季度的第一天減一

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)). AddDays(1 - DateTime.Now);
DateTime.Now.AddMonths(
0 - ((DateTime.Now.Month - 1) % 3)).AddDays(1 - DateTime.Now.Day).AddDays(-1
).ToShortDateString();

 

 

    這篇文章旨在與園友分享我對Exception的理解,如果存在不足的地方歡迎您指出。 

     前不久寫過一篇MVC的Exception的文章,這回重點講解在實際開發中我對Exception 的認識。

     講到Exception難免會涉及到經典的代碼try..catch...finally..至於一些基本概念:這個代碼塊的執行方式、多catch的異常捕獲順序、exception的繼承。這些不是本篇討論的重點,但這不併代表基本概念不重要。(:

     建立Exception 時建議日常開發中需要注意以下幾點:

      一、Throw new exception


            曾經看過有人在簡單的函數內瘋狂的使用throw new 參與業務邏輯。比如,以下代碼:

01 public object DoSomeThing(string userName)
02         {
03             try
04             {
05                 if (String.IsNullOrEmpty(userName))
06                 {
07                     throw new Exception("用戶名不能爲空");
08                 }
09             }
10             catch (Exception ex)
11             {
12                 return ex.Message;
13             }
14             return true;
15         }

 

邏輯類似以上代碼,就是一個單一的函數,每當我看到這樣的單一函數,總是覺得很奇怪。或許是自身水平有限,似乎難以理解爲了catch住一個exception對象需要那麼大費周章的去throw new 麼?個人認爲如果某方法內嵌套的方法根據業務邏輯主動拋出異常,讓外層方法截獲到這個異常,此時被嵌套的方法方可使用throw new ....

 

     二、拋出不該拋出的Exception


     上文中的DoSomeThing函數如果在catch時不進一步封裝,直接把Excepiton拋到UI層,又或者直接顯示給客戶。如果異常堆棧中提示某些敏感數據。比如SQL查詢語句、WebService
URI或POST信息等。這些敏感信息應該永遠不讓客戶知道,暴露出這些信息有可能對系統造成潛在安全隱患!

 

    三、更好的利用Exception


     在實際的開發中,既然拋出了Exception那麼我們應該爲Exception提供儘可能多的關於異常本身的有用信息。如何爲拋出的異常提供更多的有用信息呢?請看以下代碼:

01 public static void ExecuteCommand(Action<IDbCommand> action, ref string errMsg)
02         {
03             using (var connection = new SqlConnection("數據庫連接字符串"))
04             {
05                 var cmd = connection.CreateCommand();
06                 try
07                 {
08                     action(cmd);
09                     cmd.ExecuteNonQuery();
10                 }
11                 catch (DbException ex) //注意這裏將DbException catch住
12                 {
13                     errMsg = ex.Message;
14                     var parameters = new Dictionary<string, object>();
15                     foreach (SqlParameter p in cmd.Parameters)
16                         parameters.Add(p.ParameterName, p.Value);
17   
18                     //儘可能獲取與exception相關的有用信息,這裏只是用SqlParameter舉例而已。
19   
20                     //TODO:(將 parameters 與 ex 對象保存或者進一步處理)
21   
22                 }
23                 catch (Exception ex)
24                 {
25                     //TODO 其他的異常處理
26                 }
27                 finally
28                 {
29                     cmd.Dispose();
30                 }
31             }
32         }

 

註釋已經給的很清晰了,目的就是儘可能的提供與異常相關的有用信息,方便日後異常出現時便於調試。

ExecuteCommand方法調用如下:

01 static void Main(string[] args)
02         {
03             string errMsg = string.Empty;
04             ExecuteCommand(cmd =>
05             {
06                 cmd.CommandText = "UPDATE user SET name=@name WHERE id=@id";
07                 cmd.Parameters.Add(new SqlParameter("name", "字符串參數值"));
08                 cmd.Parameters.Add(new SqlParameter("id", 1));
09             }, ref errMsg);
10   
11         }

 

類似以上機制,如果異常出現了,我認爲可以大大減少debug的時間。

 

最後希望本篇文章可以給您帶來幫助,如有不足之處歡迎指出,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章