C#日期比較計算兩個日期的時間間隔,日期格式化


1.定義函數

///   /// C#日期比較計算兩個日期的時間間隔         
        ///   /// 第一個日期和時間  /// 第二個日期和時間  ///   
        private string DateDiff(DateTime DateTime1, DateTime DateTime2)
        {
            string dateDiff = null;
            TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
            TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);
            TimeSpan ts = ts1.Subtract(ts2).Duration();
            dateDiff = ts.Days.ToString() + "" + ts.Hours.ToString() + "小時" + ts.Minutes.ToString() + "分鍾" + ts.Seconds.ToString() + "";


            float nYear = ((float)ts.Days) / 365;//

            return nYear.ToString();//dateDiff
        }

2.調用

DateTime dt1 = new DateTime();
                DateTime dt2 = new DateTime();

                dt1 = DateTime.Now;
                dt2 = DateTime.Parse(dt.Rows[0]["EBirthday"].ToString());
                string strAge = DateDiff(dt1, dt2);//
                this.txt_BI_UAge.Text = strAge;

 

//以上為自己所寫,字段須定義!

3.實際使用:

///與系統日期比較后[比較的系統時間為-8小時] ,返回相差多少時間的量,可以負數
private TimeSpan cSDT( string Date2)
        {
            DateTime _Tsys = DateTime.Now.AddHours(-8);
            DateTime _TPDate = Convert.ToDateTime(DateTime.Parse(Date2));
            return _Tsys.Subtract(_TPDate);
        }
///與系統日期比較后
        private TimeSpan cSDT2(string Date2)
        {
            DateTime _Tsys = DateTime.Now;
            DateTime _TPDate = Convert.ToDateTime(DateTime.Parse(Date2));
            return _Tsys.Subtract(_TPDate);
        }

===========================

 

//1。比較時間大小的實驗  
string   st1="12:13";  
string   st2="14:14";  
DateTime   dt1=Convert.ToDateTime(st1);  
DateTime   dt2=Convert.ToDateTime(st2);  
DateTime   dt3=DateTime.Now;  
if(DateTime.Compare(dt1,dt2)>0)  
msg.Text=st1+">"+st2;  
else  
msg.Text=st1+"<"+st2;  
msg.Text+="\r\n"+dt1.ToString();  
if(DateTime.Compare(dt1,dt3)>0)  
msg.Text+="\r\n"+st1+">"+dt3.ToString();  
else  
msg.Text+="\r\n"+st1+"<"+dt3.ToString();  
   
//2。計算兩個時間差值的函數,返回時間差的絕對值:  
private   string   DateDiff(DateTime   DateTime1,DateTime   DateTime2)  
{  
   string   dateDiff=null;  
   try  
   {  
     TimeSpan   ts1=new     TimeSpan(DateTime1.Ticks);  
     TimeSpan   ts2=new     TimeSpan(DateTime2.Ticks);  
     TimeSpan   ts=ts1.Subtract(ts2).Duration();  
     dateDiff=ts.Days.ToString()+""  
         +ts.Hours.ToString()+"小時"  
         +ts.Minutes.ToString()+"分鍾"  
         +ts.Seconds.ToString()+"";  
   }  
   catch  
   {

   }  
   return   dateDiff;  
}  
   
//3。實現計算DateTime1-36天=DateTime2的功能   
TimeSpan   ts=new TimeSpan(40,0,0,0);  
DateTime   dt2=DateTime.Now.Subtract(ts);  
msg.Text=DateTime.Now.ToString()+"-"+ts.Days.ToString()+"天\r\n";  
msg.Text+=dt2.ToString();

 

 

//=====================

 

 //取得某月的最后一天
    //方法一:使用算出該月多少天,年+月+加上多少天即得,舉例取今天這個月的最后一天
    private void GetLastDateForMonth(DateTime DtStart, out DateTime DtEnd)
    {
        int Dtyear, DtMonth;
        DtStart = DateTime.Now;
        Dtyear = DtStart.Year;
        DtMonth = DtStart.Month;
        int MonthCount = DateTime.DaysInMonth(Dtyear, DtMonth);//計算該月有多少天
        DtEnd = Convert.ToDateTime(Dtyear.ToString() + "-" + DtMonth.ToString() + "-" + MonthCount);
    }
    //方法二:取出下月的第一天減去一天便是這個月的最后一天
    private void GetLastDateForMonth(DateTime DtStart, out DateTime DtEnd)
    {
        int Dtyear, DtMonth;

        DtStart = DateTime.Now.AddMonths(1);//月份加1
        Dtyear = DtStart.Year;
        DtMonth = DtStart.Month;
        DtEnd = Convert.ToDateTime(Dtyear.ToString() + "-" + DtMonth.ToString() + "-" + "1").AddDays(-1);//取出下月的第一天減去一天
    }

 

二、時間差的計算
法一、使用TimeSpan ,同時也介紹一下TimeSpan的用法
相關屬性和函數
Add:與另一個TimeSpan值相加。
Days:返回用天數計算的TimeSpan值。
Duration:獲取TimeSpan的絕對值。
Hours:返回用小時計算的TimeSpan值
Milliseconds:返回用毫秒計算的TimeSpan值。
Minutes:返回用分鍾計算的TimeSpan值。
Negate:返回當前實例的相反數。
Seconds:返回用秒計算的TimeSpan值。
Subtract:從中減去另一個TimeSpan值。
Ticks:返回TimeSpan值的tick數。
TotalDays:返回TimeSpan值表示的天數。
TotalHours:返回TimeSpan值表示的小時數。
TotalMilliseconds:返回TimeSpan值表示的毫秒數。
TotalMinutes:返回TimeSpan值表示的分鍾數。
TotalSeconds:返回TimeSpan值表示的秒數。
簡單示例:
DateTime d1 =new DateTime(2004,1,1,15,36,05);
DateTime d2 =new DateTime(2004,3,1,20,16,35);
TimeSpan d3 = d2.Subtract(d1);
LbTime.Text = "相差:"
+d3.Days.ToString()+"天"
+d3.Hours.ToString()+"小時"
+d3.Minutes.ToString()+"分鍾"
+d3.Seconds.ToString()+"秒";
法二、使用Sql中的DATEDIFF函數
使用方法:DATEDIFF ( datepart , startdate , enddate )
它能幫你取出你想要的各種形式的時間差,如相隔多少天,多少小時,多少分鍾等,具體格式如下:

日期部分縮寫

year yy, yyyy
quarter qq, q
Month mm, m
dayofyear dy, y
Day dd, d
Week wk, ww
Hour hh
minute mi, n
second ss, s
millisecond ms



如:datediff(mi,DtOpTime,DtEnd) 便能取出他們之間時間差的分鍾總數,已經幫你換算好了,對於要求規定單位,時、分、秒特別有用

三 計算兩個日期之間相差的工作日天數
/// <summary>
   /// 計算兩個日期之間相差的工作日天數
   /// </summary>
   /// <param name="dtStart">開始日期</param>
   /// <param name="dtEnd">結束日期</param>
   /// <returns>Int</returns>
   public int CalculateWorkingDays(DateTime dtStart, DateTime dtEnd)
   {
    int count=0;
    for(DateTime dtTemp=dtStart;dtTemp<dtEnd;dTemp=dtTemp.AddDays(1))
    {
//     if(dtTemp.DayOfWeek!=DayOfWeek.Saturday&&dtTemp.DayOfWeek!=DayOfWeek.Sunday)
//     {
//      count++;
//     }
     count++;
    }
    return count;
   }
DateTime是內置的事件類型,TimeSpan是內置的事件間隔類型
兩個類型為DateTime的變量作-運算得到類型為TimeSpan的數據
DateTime.Now是一個只讀屬性,返回當前的時間,類型為DateTime
TimeSpan :根據輸入日期計算兩個指定日期之間的時間間隔。
語法:String TimeSpan('轉義字符','被比較日期','目標比較日期')

傳回值:字符

參數說明:

   轉義字符:輸入類型為字符,具有不同格式化字符的字符如內容說明中所例。輸入字符內的格式化字符被格式化后輸出,其他不屬於格式化的字符則根據對應位置輸出。'被比較日期':輸入類型為字符,需要被比較的日期格式的字符內容。'目標比較日期':輸入類型為字符,用來比較的目標日期格式的字符內容。

內容說明:根據輸入日期計算兩個指定日期之間的時間間隔。

轉義字符說明:T:獲 取兩個日期之間差異刻度表示的差異值。(正數或負數)d:獲取兩個日期之間差異的整天數。(正數或負數)h:獲取兩個日期之間差異的整小時數。(正數或負 數)u:獲取兩個日期之間差異的整毫秒數。(正數或負數)m:獲取兩個日期之間差異的整分鍾數。(正數或負數)s:獲取兩個日期之間差異的整秒數。(正數 或負數)D:獲取兩個日期之間以整天數和天的小數部分表示的差異值。(正數或負數)H:獲取兩個日期之間以整小時數和小時的小數部分表示的差異值。(正數 或負數)U:獲取兩個日期之間整毫秒數和毫秒的小數部分表示的差異值。(正數或負數)M:獲取兩個日期之間以整分鍾數和分鍾的小數部分表示的差異值。(正 數或負數)S:獲取兩個日期之間以整秒數和秒的小數部分表示的差異值。(正數或負數)

//================

 

C#日期時間格式化

 

日期轉化一

為了達到不同的顯示效果有時,我們需要對時間進行轉化,默認格式為: 2007 - 01 - 03   14 : 33 : 34  ,要轉化為其他格式,要用到DateTime.ToString的方法(String, IFormatProvider),如下所示:

using  System;
using  System.Globalization;
String format
= " D " ;
DateTime date
= DataTime,Now;
Response.Write(date.ToString(format, DateTimeFormatInfo.InvariantInfo));

結果輸出
Thursday, June 
16 2005

參數format格式詳細用法:

格式字符 關聯屬性
/ 說明 
d ShortDatePattern 
D LongDatePattern 
f 完整日期和時間(長日期和短時間) 
F FullDateTimePattern(長日期和長時間) 
g 常規(短日期和短時間) 
G 常規(短日期和長時間) 
m、M MonthDayPattern 
r、R RFC1123Pattern 
s 使用當地時間的 SortableDateTimePattern(基於 ISO 
8601 ) 
t ShortTimePattern 
T LongTimePattern 
u UniversalSortableDateTimePattern 用於顯示通用時間的格式 
U 使用通用時間的完整日期和時間(長日期和長時間) 
y、Y YearMonthPattern 

下表列出了可被合並以構造自定義模式的模式。這些模式是區分大小寫的;例如,識別“MM”,但不識別“mm”。如果自定義模式包含空白字符或用單引號括起來的字符,則輸出字符串頁也將包含這些字符。未定義為格式模式的一部分或未定義為格式字符的字符按其原義復制。

格式模式 說明 
d 月中的某一天。一位數的日期沒有前導零。 
dd 月中的某一天。一位數的日期有一個前導零。 
ddd 周中某天的縮寫名稱,在 AbbreviatedDayNames 中定義。 
dddd 周中某天的完整名稱,在 DayNames 中定義。 
M 月份數字。一位數的月份沒有前導零。 
MM 月份數字。一位數的月份有一個前導零。 
MMM 月份的縮寫名稱,在 AbbreviatedMonthNames 中定義。 
MMMM 月份的完整名稱,在 MonthNames 中定義。 
y 不包含紀元的年份。如果不包含紀元的年份小於 
10 ,則顯示不具有前導零的年份。 
yy 不包含紀元的年份。如果不包含紀元的年份小於 
10 ,則顯示具有前導零的年份。 
yyyy 包括紀元的四位數的年份。 
gg 時期或紀元。如果要設置格式的日期不具有關聯的時期或紀元字符串,則忽略該模式。 
12  小時制的小時。一位數的小時數沒有前導零。 
hh 
12  小時制的小時。一位數的小時數有前導零。 
24  小時制的小時。一位數的小時數沒有前導零。 
HH 
24  小時制的小時。一位數的小時數有前導零。 
m 分鍾。一位數的分鍾數沒有前導零。 
mm 分鍾。一位數的分鍾數有一個前導零。 
s 秒。一位數的秒數沒有前導零。 
ss 秒。一位數的秒數有一個前導零。 
f 秒的小數精度為一位。其余數字被截斷。 
ff 秒的小數精度為兩位。其余數字被截斷。 
fff 秒的小數精度為三位。其余數字被截斷。 
ffff 秒的小數精度為四位。其余數字被截斷。 
fffff 秒的小數精度為五位。其余數字被截斷。 
ffffff 秒的小數精度為六位。其余數字被截斷。 
fffffff 秒的小數精度為七位。其余數字被截斷。 
t 在 AMDesignator 或 PMDesignator 中定義的 AM
/ PM 指示項的第一個字符(如果存在)。 
tt 在 AMDesignator 或 PMDesignator 中定義的 AM
/ PM 指示項(如果存在)。 
z 時區偏移量(“
+ ”或“ - ”后面僅跟小時)。一位數的小時數沒有前導零。例如,太平洋標准時間是“ - 8 ”。 
zz 時區偏移量(“
+ ”或“ - ”后面僅跟小時)。一位數的小時數有前導零。例如,太平洋標准時間是“ - 08 ”。 
zzz 完整時區偏移量(“
+ ”或“ - ”后面跟有小時和分鍾)。一位數的小時數和分鍾數有前導零。例如,太平洋標准時間是“ - 08 : 00 ”。 
: 在 TimeSeparator 中定義的默認時間分隔符。 
/  在 DateSeparator 中定義的默認日期分隔符。 
%  c 其中 c 是格式模式(如果單獨使用)。如果格式模式與原義字符或其他格式模式合並,則可以省略“ % ”字符。 
 c 其中 c 是任意字符。照原義顯示字符。若要顯示反斜杠字符,請使用“\”。 

只有上面第二個表中列出的格式模式才能用於創建自定義模式;在第一個表中列出的標准格式字符不能用於創建自定義模式。自定義模式的長度至少為兩個字符;例如, 

DateTime.ToString( 
" d " ) 返回 DateTime 值;“d”是標准短日期模式。 
DateTime.ToString( 
" %d " ) 返回月中的某天;“ % d”是自定義模式。 
DateTime.ToString( 
" " ) 返回后面跟有一個空白字符的月中的某天;“d”是自定義模式。 

比較方便的是,上面的參數可以隨意組合,並且不會出錯,多試試,肯定會找到你要的時間格式
如要得到2005年06月 這樣格式的時間
可以這樣寫:
date.ToString(
" yyyy年MM月 " , DateTimeFormatInfo.InvariantInfo)

日期轉化二

DateTime dt 
=  DateTime.Now;
Label1.Text 
=  dt.ToString(); // 2005-11-5 13:21:25
Label2.Text  =  dt.ToFileTime().ToString(); // 127756416859912816
Label3.Text  =  dt.ToFileTimeUtc().ToString(); // 127756704859912816
Label4.Text  =  dt.ToLocalTime().ToString(); // 2005-11-5 21:21:25
Label5.Text  =  dt.ToLongDateString().ToString(); // 2005年11月5日
Label6.Text  =  dt.ToLongTimeString().ToString(); // 13:21:25
Label7.Text  =  dt.ToOADate().ToString(); // 38661.5565508218
Label8.Text  =  dt.ToShortDateString().ToString(); // 2005-11-5
Label9.Text  =  dt.ToShortTimeString().ToString(); // 13:21
Label10.Text  =  dt.ToUniversalTime().ToString(); // 2005-11-5 5:21:25

Label1.Text 
=  dt.Year.ToString(); // 2005
Label2.Text  =  dt.Date.ToString(); // 2005-11-5 0:00:00
Label3.Text  =  dt.DayOfWeek.ToString(); // Saturday
Label4.Text  =  dt.DayOfYear.ToString(); // 309
Label5.Text  =  dt.Hour.ToString(); // 13
Label6.Text  =  dt.Millisecond.ToString(); // 441
Label7.Text  =  dt.Minute.ToString(); // 30
Label8.Text  =  dt.Month.ToString(); // 11
Label9.Text  =  dt.Second.ToString(); // 28
Label10.Text  =  dt.Ticks.ToString(); // 632667942284412864
Label11.Text  =  dt.TimeOfDay.ToString(); // 13:30:28.4412864

Label1.Text 
=  dt.ToString(); // 2005-11-5 13:47:04
Label2.Text  =  dt.AddYears( 1 ).ToString(); // 2006-11-5 13:47:04
Label3.Text  =  dt.AddDays( 1.1 ).ToString(); // 2005-11-6 16:11:04
Label4.Text  =  dt.AddHours( 1.1 ).ToString(); // 2005-11-5 14:53:04
Label5.Text  =  dt.AddMilliseconds( 1.1 ).ToString(); // 2005-11-5 13:47:04
Label6.Text  =  dt.AddMonths( 1 ).ToString(); // 2005-12-5 13:47:04
Label7.Text  =  dt.AddSeconds( 1.1 ).ToString(); // 2005-11-5 13:47:05
Label8.Text  =  dt.AddMinutes( 1.1 ).ToString(); // 2005-11-5 13:48:10
Label9.Text  =  dt.AddTicks( 1000 ).ToString(); // 2005-11-5 13:47:04
Label10.Text  =  dt.CompareTo(dt).ToString(); // 0
Label11.Text  =  dt.Add( ? ).ToString(); // 問號為一個時間段

Label1.Text 
=  dt.Equals( " 2005-11-6 16:11:04 " ).ToString(); // False
Label2.Text  =  dt.Equals(dt).ToString(); // True
Label3.Text  =  dt.GetHashCode().ToString(); // 1474088234
Label4.Text  =  dt.GetType().ToString(); // System.DateTime
Label5.Text  =  dt.GetTypeCode().ToString(); // DateTime

Label1.Text 
=  dt.GetDateTimeFormats( ' s ' )[ 0 ].ToString(); // 2005-11-05T14:06:25
Label2.Text  =  dt.GetDateTimeFormats( ' t ' )[ 0 ].ToString(); // 14:06
Label3.Text  =  dt.GetDateTimeFormats( ' y ' )[ 0 ].ToString(); // 2005年11月
Label4.Text  =  dt.GetDateTimeFormats( ' D ' )[ 0 ].ToString(); // 2005年11月5日
Label5.Text  =  dt.GetDateTimeFormats( ' D ' )[ 1 ].ToString(); // 2005 11 05
Label6.Text  =  dt.GetDateTimeFormats( ' D ' )[ 2 ].ToString(); // 星期六 2005 11 05
Label7.Text  =  dt.GetDateTimeFormats( ' D ' )[ 3 ].ToString(); // 星期六 2005年11月5日
Label8.Text  =  dt.GetDateTimeFormats( ' M ' )[ 0 ].ToString(); // 11月5日
Label9.Text  =  dt.GetDateTimeFormats( ' f ' )[ 0 ].ToString(); // 2005年11月5日 14:06
Label10.Text  =  dt.GetDateTimeFormats( ' g ' )[ 0 ].ToString(); // 2005-11-5 14:06
Label11.Text  =  dt.GetDateTimeFormats( ' r ' )[ 0 ].ToString(); // Sat, 05 Nov 2005 14:06:25 GMT

Label1.Text 
=   string .Format( " {0:d} " ,dt); // 2005-11-5
Label2.Text  =   string .Format( " {0:D} " ,dt); // 2005年11月5日
Label3.Text  =   string .Format( " {0:f} " ,dt); // 2005年11月5日 14:23
Label4.Text  =   string .Format( " {0:F} " ,dt); // 2005年11月5日 14:23:23
Label5.Text  =   string .Format( " {0:g} " ,dt); // 2005-11-5 14:23
Label6.Text  =   string .Format( " {0:G} " ,dt); // 2005-11-5 14:23:23
Label7.Text  =   string .Format( " {0:M} " ,dt); // 11月5日
Label8.Text  =   string .Format( " {0:R} " ,dt); // Sat, 05 Nov 2005 14:23:23 GMT
Label9.Text  =   string .Format( " {0:s} " ,dt); // 2005-11-05T14:23:23
Label10.Text    string .Format( " {0:t} " ,dt); // 14:23
Label11.Text  =   string .Format( " {0:T} " ,dt); // 14:23:23
Label12.Text  =   string .Format( " {0:u} " ,dt); // 2005-11-05 14:23:23Z
Label13.Text  =   string .Format( " {0:U} " ,dt); // 2005年11月5日 6:23:23
Label14.Text  =   string .Format( " {0:Y} " ,dt); // 2005年11月
Label15.Text  =   string .Format( " {0} " ,dt); // 2005-11-5 14:23:23
Label16.Text  =   string .Format( " {0:yyyyMMddHHmmssffff} " ,dt);  

C#比較兩時間大小

1、比較時間大小的實驗
    string st1="12:13";
    string st2="14:14";
    DateTime dt1=Convert.ToDateTime(st1);
    DateTime dt2=Convert.ToDateTime(st2);
    DateTime dt3=DateTime.Now;
    if(DateTime.Compare(dt1,dt2)>0)
     msg.Text=st1+">"+st2;
    else
     msg.Text=st1+"<"+st2;
    msg.Text+="\r\n"+dt1.ToString();
    if(DateTime.Compare(dt1,dt3)>0)
     msg.Text+="\r\n"+st1+">"+dt3.ToString();
    else
     msg.Text+="\r\n"+st1+"<"+dt3.ToString();
2、計算兩個時間差值的函數,返回時間差的絕對值:
         private string DateDiff(DateTime DateTime1,DateTime DateTime2)
         {
             string dateDiff=null;
             try
             {
                 TimeSpan ts1=new   TimeSpan(DateTime1.Ticks);
                 TimeSpan ts2=new   TimeSpan(DateTime2.Ticks);
                 TimeSpan ts=ts1.Subtract(ts2).Duration();
                 dateDiff=ts.Days.ToString()+"天"
                         +ts.Hours.ToString()+"小時"
                         +ts.Minutes.ToString()+"分鍾"
                         +ts.Seconds.ToString()+"秒";
             }
             catch
             {
             }
             return dateDiff;
         }
3、實現計算DateTime1-36天=DateTime2的功能
    TimeSpan ts=new TimeSpan(40,0,0,0);
    DateTime dt2=DateTime.Now.Subtract(ts);
    msg.Text=DateTime.Now.ToString()+"-"+ts.Days.ToString()+"天\r\n";
    msg.Text+=dt2.ToString();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM