iT邦幫忙

1

C#西元轉民國問題請教

c#
        public static DateTime ToDate(string dt)
        {
            if (String.IsNullOrWhiteSpace(dt)) return new DateTime(1900, 1, 1);
            DateTime dateValue;
            if (DateTime.TryParse(dt, out dateValue))
            {
                if (dateValue.Year<1000)
                {
                    dateValue= dateValue.AddYears(1911);
                }
                return dateValue;
            } else
                return new DateTime(1900, 1, 1);

        }

這是我的一段西元轉民國的程式碼,原則上都可以使用
只是不知道為什麼好像超過10年,也就是99年開始往前選,
就會直接回傳return new DateTime(1900, 1, 1);
不知道是哪邊錯誤,還請各位幫我看一下,謝謝

WQ iT邦新手 2 級 ‧ 2020-02-17 15:01:18 檢舉
電腦年度好像是1970年1月1日開始,所以...不建議寫1900,1,1
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
Zed_Yang
iT邦新手 3 級 ‧ 2020-02-17 14:09:24
最佳解答

if (DateTime.TryParse(dt, out dateValue))
這段他是依據電腦設定轉換成西元年月日 你給他的參數dt是民國
但你是在條件判斷結束才轉換完畢

參考資料

public static DateTime ToDate(string dt)
{
    if (String.IsNullOrWhiteSpace(dt)) return new DateTime(1900, 1, 1);
    
    
    DateTime dateValue;

    if(Datetime.TryParse((Convert.ToInt32(dt)+1911).Tostring()+"/01/01",out dateValue))
    {
        return dateValue;
    }
    else
    {
        return new Datetime(1900,1,1);
    }

}
Zed_Yang iT邦新手 3 級 ‧ 2020-02-17 14:18:31 檢舉

不如一開始傳進來的型態改成int

        private void button2_Click(object sender, EventArgs e)
        {
            label1.Text = ToDate(Convert.ToInt32(string.IsNullOrEmpty(Year.Text) ? "0" : Year.Text)).ToString("yyyy/MM/dd");
        }

        public static DateTime ToDate(int dt)
        {
            //在呼叫的地方先判斷 民國年欄位沒輸入預設為帶0
            if (dt == 0)
            { return new DateTime(1900, 1, 1); }
            else
            {
                var test = (dt + 1911).ToString()+"/01/01";
                var test2 = Convert.ToDateTime(test);

                return test2;
            }
        }
tenno081 iT邦研究生 4 級 ‧ 2020-02-18 11:39:34 檢舉

已解決,感謝

2
小魚
iT邦大師 1 級 ‧ 2020-02-17 13:37:28

你還是直接用數字判斷吧,
正規的轉DateTime應該是用西元年來轉,
而且你的標題是不是顛倒了??

1
w4560000
iT邦研究生 5 級 ‧ 2020-02-17 14:27:29

我測試時傳入 "95/02/17 12:00:00" 它是回傳 DateTime形式的1995/2/17 下午 12:00:00

你這段Mehtod是不是想要做 不管傳入西元或民國時間 都會轉成西元的DateTime型式?
我覺得先處理年份再來轉DateTime會不會比較好?

public static DateTime ToDate(string dt)
{
    if (String.IsNullOrWhiteSpace(dt)) return new DateTime(1900, 1, 1);
	
	string[] array = dt.Split('-');
	if(Convert.ToInt32(array[0]) < 1000)
		array[0] = (Convert.ToInt32(array[0]) + 1911).ToString();
	
    if (DateTime.TryParse(String.Join("-", array), out DateTime dateValue))
    	return dateValue;
    else
    	return new DateTime(1900, 1, 1);

}
0
優悠
iT邦新手 3 級 ‧ 2020-02-17 15:04:08

看你程式碼,應該是民國字串轉DateTime,附上我寫的

        /// <summary>
        /// 民國字串轉DateTime
        /// </summary>
        /// <param name="sValue"></param>
        /// <returns></returns>
        public static DateTime GetTwdate(string sValue, string sFormat)
        {
            int iADNum = 1911;
            return DateTime.ParseExact((int.Parse(sValue.Substring(0, 3)) + iADNum) + sValue.Substring(3), sFormat, System.Globalization.CultureInfo.InvariantCulture);
        }
        
        //使用:
        DateTime AAA=GetTwdate(dt,"yyyyMMdd");
        //我公司民國時間格式都固定"yyyMMdd",所以函式內轉換成西元字串,是沒有問題的,但你得自己要整調一下。

參考網站:
https://dotblogs.com.tw/chhuang/2008/03/18/1921

0
YC
iT邦研究生 3 級 ‧ 2020-02-24 11:20:54

為什麼不用TaiwanCalendar?原生就有提供了,這樣不是一勞永逸?而且,你也沒每考慮到閏年蟲呀!

我要發表回答

立即登入回答