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) |
05 |
if
(String.IsNullOrEmpty(userName)) |
07 |
throw
new Exception( "用戶名不能爲空" );
|
邏輯類似以上代碼,就是一個單一的函數,每當我看到這樣的單一函數,總是覺得很奇怪。或許是自身水平有限,似乎難以理解爲了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)
|
03 |
using
(var connection = new
SqlConnection( "數據庫連接字符串" ))
|
05 |
var cmd = connection.CreateCommand();
|
09 |
cmd.ExecuteNonQuery();
|
11 |
catch
(DbException ex) |
14 |
var parameters =
new Dictionary< string ,
object >();
|
15 |
foreach
(SqlParameter p in
cmd.Parameters) |
16 |
parameters.Add(p.ParameterName, p.Value);
|
註釋已經給的很清晰了,目的就是儘可能的提供與異常相關的有用信息,方便日後異常出現時便於調試。
ExecuteCommand方法調用如下:
01 |
static
void Main( string [] args)
|
03 |
string
errMsg = string .Empty;
|
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));
|
類似以上機制,如果異常出現了,我認爲可以大大減少debug的時間。
最後希望本篇文章可以給您帶來幫助,如有不足之處歡迎指出,謝謝!