2008/02/25

C# DateTime 日期格式轉換

C#有個DateTime的物件用來處理日期的其中DateTime.ParseExact 方法(System)方法可以將日期和時間的指定字串表示轉換為其對等的DateTime
字串表示的格式必須完全符合指定的格式。
再搭配DateTime.ToString (IFormatProvider)
方法使用格式資訊,將這個執行個體的值轉換為它的對等字串表示。


// 將字串日期轉整數
// 日期字串
// 整數日期格式
private static int ParseDate(string _date)
{
    //這裡定義所有日期格式
    string[] dateFormats = { "yyyy/MM/dd", "yyy/MM/dd", "yy/MM/dd", "y/MM/dd",
    "yyyy-MM-dd", "yyy-MM-dd", "yy-MM-dd", "y-MM-dd",
    "yyyy/M/dd","yyy/M/dd","yy/M/dd","y/M/dd",
    "yyyy-M-dd","yyy-M-dd","yy-M-dd","y-M-dd",
    "yyyy/MM/d","yyy/MM/d","yy/MM/d","y/MM/d",
    "yyyy-MM-d","yyy-MM-d","yy-MM-d","y-MM-d",
    "yyyy/M/d","yyy/M/d","yy/M/d","y/M/d",
    "yyyy-M-d","yyy-M-d","yy-M-d","y-M-d"};
    try
    {
        //這裡來處理傳入的格式是否為日期格式,只需要簡單一行
        DateTime datetime = DateTime.ParseExact(_date, dateFormats, null, DateTimeStyles.AllowWhiteSpaces);
        int iToken = _date.IndexOf("-", 0);
        if (iToken == -1)
        iToken = _date.IndexOf("/",0);
        string iYear = _date.Substring(0, iToken);
        switch (iYear.Length)
        {
            //這裡是利用datetime.ToString(IFormatProvider)
            //的方法傳出自己想要的統一格式
            case 1:
            return Int32.Parse(datetime.ToString("yMMdd"));
            case 2:
            return Int32.Parse(datetime.ToString("yyMMdd"));
            case 3:
            return Int32.Parse(datetime.ToString("yyyMMdd"));
            case 4:
            return Int32.Parse(datetime.ToString("yyyyMMdd"));
        }
        return 0;
    }
    catch (Exception)
    {
        return 0;
    }
}

甚至時間也可以這樣來做

// 將字串時間轉換為整數時間
// 時間字串(HH:mm:ss
// HHmmss整數格式
private static int ParseTime(string _time)
{
    string[] timeFormats = { "HH:mm:ss", "HH:mm:s","HH:m:ss", "HH:m:s",
    "H:mm:ss","H:mm:s","H:m:ss","H:m:s"};
    try
    {
        DateTime datetime = DateTime.ParseExact(_time, timeFormats, null,DateTimeStyles.AllowWhiteSpaces);
        return Int32.Parse(datetime.ToString("HHmmss"));
    }
    catch(Exception)
    {
        return 0;
    }
}

2008/02/21

C# 日期 轉 農曆

System.Globalization 這個命名空間很有趣,竟然有 TaiwanCalendar 與 TaiwanLunisolarCalendar 類別!

TaiwanCalendar 是指台灣使用的曆法,也就是「民國年」的計算法。


DateTime now = DateTime.Now;
TaiwanCalendar tc = new TaiwanCalendar();

int year = tc.GetYear(now);
MessageBox.Show(year.ToString());
// Output : 96

int month = tc.GetMonth(now);
// Output : 12

int daysOfMonth = tc.GetDaysInMonth(year, month);
MessageBox.Show(daysOfMonth.ToString());
// Output : 4

TaiwanLunisolarCalendar 是指台灣使用的陰陽曆(農曆)。和 TaiwanCalendar 相同,但可以使用西元年份計算,而日期和月份則使用陰陽曆計算,真的很省事!

TaiwanLunisolarCalendar tlc = new TaiwanLunisolarCalendar();

// 取得目前支援的農曆日曆到幾年幾月幾日( 2051-02-10 )
tlc.MaxSupportedDateTime.ToShortDateString();

// 取得今天的農曆年月日
txtContent.Text =
tlc.GetYear(DateTime.Now).ToString() + "-" +
tlc.GetMonth(DateTime.Now).ToString() + "-" +
tlc.GetDayOfMonth(DateTime.Now).ToString();

C# 計算日期 是 星期幾

基姆拉爾森計算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日數,m表示月份數,y表示年數。
注意:在公式中有個與其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10則換算成:2003-13-10來代入公式計算。
代碼如下:


//y-年,m-月,d-日期
string CaculateWeekDay(int y,int m, int d)
{
if(m==1) m=13;
if(m==2) m=14;
int week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
string weekstr="";
switch(week)
{
case 1: weekstr="星期一"; break;
case 2: weekstr="星期二"; break;
case 3: weekstr="星期三"; break;
case 4: weekstr="星期四"; break;
case 5: weekstr="星期五"; break;
case 6: weekstr="星期六"; break;
case 7: weekstr="星期日"; break;
}
return weekstr;
}
調用方法:
Label2।Text=CaculateWeekDay(2004,12,9);

取得一年中某一個月天數,EX 2008/01
label4।Text = DateTime.DaysInMonth(2008,1).ToString();

先取得2月在減1天,就是1月的最後一天了.
//今天
DateTime.Now.Date.ToString();
//昨天
DateTime.Now.AddDays(-1).ToString();
//明天
DateTime.Now.AddDays(1).ToString();

//本週第1天及最後1天 (要注意的是這裡的每一週是從週日始至週六止)
DateTime.Today.AddDays (-(int)DateTime.Today.DayOfWeek).ToString();
DateTime.Today.AddDays (6 -(int)DateTime.Today.DayOfWeek).ToString();

//上週, 一個周是7天,上週就是本週再減去7天
DateTime.Today.AddDays (-(int)DateTime.Today.DayOfWeek - 7).ToString();
DateTime.Today.AddDays (6 -(int)DateTime.Today.DayOfWeek - 7).ToString();

//下周
DateTime.Today.AddDays (-(int)DateTime.Today.DayOfWeek + 7).ToString();
DateTime.Today.AddDays (6 -(int)DateTime.Today.DayOfWeek + 7).ToString();


//巧用C#裡ToString的字符格式化
//本用第1天及最後1天
DateTime.Now.ToString("yyyy-MM-01");
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).AddDays(-1).ToString();

//上個月第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(-1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddDays(-1).ToString();
//下個月第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(2).AddDays(-1).ToString();

//今年第1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).ToString();
//今年最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).AddDays(-1).ToString();

//去年第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(-1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddDays(-1).ToString();

//明年第1天及最後1天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).ToString();
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(2).AddDays(-1).ToString();

//本季,一年四個季度,一個季度三個月
//先把日期推到本季度第一個月,然後這個月的第一天就是本季度的第一天了
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).ToString();
//下季
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).ToString();
//上季
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).ToString();