[C#]自訂日期和時間格式字串(zh-tw) & Framework 版本關係

最近遇到在日期後面加上星期幾的需求,

開發上很直覺得就找了星期的時間格式字串並套用台灣的星期縮寫,

結果在部署上測試機後,發現轉換出來的文字不太一樣,

所以就來做一個簡單的 Lab 來看看是否還有其他不同呢 : P

狀況

解決這個需求並沒有花多少時間,

但是在部署上測試機(.net framework 2.0 ) 後,

星期縮寫 toString("ddd") 發生問題了!!

原本應該顯示 週三  但在部署後發現測試機上顯示的是 星期三

下面就來簡單用程式碼來實測各版本Framework會產出怎樣的文字吧。

 

範例程式碼 

using System;
using System.Globalization;

namespace GlobalizationDemo
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var time = new DateTime(2017, 2, 1, 6, 7, 8);
            // 簡短日期模式 2017/2/14
            Console.WriteLine($"簡短日期模式 : {time.ToString("d", new CultureInfo("zh-tw"))}");
            // 完整日期模式 2017年2月14日
            Console.WriteLine($"完整日期模式 : {time.ToString("D", new CultureInfo("zh-tw"))}");
            // 月份天數 14
            Console.WriteLine(time.ToString("月份天數 : dd", new CultureInfo("zh-tw")));
            // 星期幾的縮寫名稱
            Console.WriteLine($"星期幾的縮寫名稱 : {time.ToString("ddd", new CultureInfo("zh-tw"))}");
            // 星期幾的完整名稱
            Console.WriteLine(time.ToString("星期幾的完整名稱 : dddd", new CultureInfo("zh-tw")));
            // 週期或紀元
            Console.WriteLine(time.ToString("週期或紀元 : g", new CultureInfo("zh-tw")));
            // 週期或紀元
            Console.WriteLine(time.ToString("週期或紀元 : gg", new CultureInfo("zh-tw")));
            // 採用 12 小時制的小時,從 1 到 12
            Console.WriteLine(time.ToString("採用 12 小時制的小時,從 1 到 12 : %h", new CultureInfo("zh-tw")));
            // 採用 12 小時制的小時,從 01 到 12
            Console.WriteLine(time.ToString("採用 12 小時制的小時,從 01 到 12 : hh", new CultureInfo("zh-tw")));
            // 採用 24 小時制的小時,從 0 到 23
            Console.WriteLine(time.ToString("採用 24 小時制的小時,從 0 到 23 : %H", new CultureInfo("zh-tw")));
            // 採用 24 小時制的小時,從 00 到 23
            Console.WriteLine(time.ToString("採用 24 小時制的小時,從 00 到 23 : HH", new CultureInfo("zh-tw")));
            // 時區資訊
            Console.WriteLine(time.ToString("時區資訊(zh-tw) : %K", new CultureInfo("zh-tw")));
            Console.WriteLine(DateTime.Now.ToString("時區資訊(Now) : %K"));
            Console.WriteLine(DateTime.UtcNow.ToString("時區資訊(UtcNow) : %K"));
            // 分鐘,從 0 到 59
            Console.WriteLine(time.ToString("分鐘,從 0 到 59 : %m", new CultureInfo("zh-tw")));
            // 分鐘,從 00 到 59
            Console.WriteLine(time.ToString("分鐘,從 00 到 59 : mm", new CultureInfo("zh-tw")));
            // 月份,從 1 到 12
            Console.WriteLine(time.ToString("月份,從 1 到 12 : M", new CultureInfo("zh-tw")));
            // 月份,從 01 到 12
            Console.WriteLine(time.ToString("月份,從 01 到 12 : MM", new CultureInfo("zh-tw")));
            // 月份的縮寫名稱
            Console.WriteLine(time.ToString("月份的縮寫名稱 : MMM", new CultureInfo("zh-tw")));
            // 月份的完整名稱
            Console.WriteLine(time.ToString("月份的完整名稱 : MMMM", new CultureInfo("zh-tw")));
            // 秒數,從 0 到 59
            Console.WriteLine(time.ToString("秒數,從 0 到 59 : s", new CultureInfo("zh-tw")));
            // 秒數,從 00 到 59
            Console.WriteLine(time.ToString("秒數,從 00 到 59 : ss", new CultureInfo("zh-tw")));
            // AM/PM 指示項的第一個字元
            Console.WriteLine(time.ToString("AM/PM 指示項的第一個字元 : t", new CultureInfo("zh-tw")));
            // AM/PM 指示項
            Console.WriteLine(time.ToString("AM/PM 指示項 : tt", new CultureInfo("zh-tw")));
            // 年份,從 0 到 99
            Console.WriteLine(time.ToString("年份,從 0 到 99 : y", new CultureInfo("zh-tw")));
            // 年份,從 00 到 99
            Console.WriteLine(time.ToString("年份,從 00 到 99 : yy", new CultureInfo("zh-tw")));
            // 年份,至少三位數
            Console.WriteLine(time.ToString("年份,至少三位數 : yyy", new CultureInfo("zh-tw")));
            // 	以四位數表示的年份
            Console.WriteLine(time.ToString("以四位數表示的年份 : yyyy", new CultureInfo("zh-tw")));
            // 以五位數表示的年份
            Console.WriteLine(time.ToString("以五位數表示的年份 : yyyyy", new CultureInfo("zh-tw")));
            // 與 UTC 相差的時數,不加上前置零
            Console.WriteLine(time.ToString("與 UTC 相差的時數,不加上前置零 : z", new CultureInfo("zh-tw")));
            // 與 UTC 相差的時數,單一位數值會加上前置零
            Console.WriteLine(time.ToString("與 UTC 相差的時數,單一位數值會加上前置零 : zz", new CultureInfo("zh-tw")));
            // 與 UTC 相差的時數,單一位數值會加上前置零 
            Console.WriteLine(time.ToString("與 UTC 相差的時數,單一位數值會加上前置零 : zzz", new CultureInfo("zh-tw")));
            // 與 UTC 相差的時數和分鐘數
            Console.WriteLine(time.ToString("與 UTC 相差的時數和分鐘數 : zzz", new CultureInfo("zh-tw")));
            Console.ReadKey();
        }
    }
}

 

結果

切換各版本Framework測試後,僅有星期縮寫在 .Net Framework 4 以下會產出完整的星期幾

希望對各位有幫助    

MSDN參考 : https://msdn.microsoft.com/zh-tw/library/8kb3ddd4(v=vs.110).aspx