最近遇到在日期後面加上星期幾的需求,
開發上很直覺得就找了星期的時間格式字串並套用台灣的星期縮寫,
結果在部署上測試機後,發現轉換出來的文字不太一樣,
所以就來做一個簡單的 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