星期一, 6月 12, 2023

[C#] 文化特性的日曆清單

實務上應用該文章 - [C#] 星期中文說明 內取得星期,在某次跑單元測試時,相關測試竟然全部 fail,研究後發現到原來是 Windows 預設日曆被變更掉

Win10 繁中 (zh-tw) 內有三種日曆可以選擇,預設為西曆 (中文),被我切換至西曆 (英文)

[C#] 文化特性的日曆清單-1

西曆 (中文) VS 西曆 (英文),剛好差異在星期文字顯示

[C#] 文化特性的日曆清單-2

C# CultureInfo zh-tw 有三種日曆清單可以使用,剛好對應 Windows 內可使用日曆,分別為
  • GregorianCalendar (Localized) 為預設值
  • TaiwanCalendar
  • GregorianCalendar (USEnglish)
可以透過 CultureInfo.OptionalCalendars 屬性來取得
using System;
using System.Globalization;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            CultureInfo ci = new CultureInfo("zh-tw");

            // 顯示 zh-tw 內的日曆
            Console.WriteLine("顯示 zh-tw 文化特性日曆清單");
            foreach (Calendar calendar in ci.OptionalCalendars)
            {
                if (calendar.GetType() == typeof(GregorianCalendar))
                {
                    GregorianCalendar gregorianCalendar = (GregorianCalendar)calendar;
                    Console.WriteLine($"     {calendar} ({gregorianCalendar.CalendarType})");
                }
                else
                {
                    Console.WriteLine($"     {calendar}");
                }
            }

            Console.WriteLine("");

            Console.WriteLine("各日曆星期表示");
            // 指定西曆 (中文)
            ci.DateTimeFormat.Calendar = new GregorianCalendar() { CalendarType = GregorianCalendarTypes.Localized };
            Console.WriteLine($"     西曆(中文):{ci.DateTimeFormat.GetDayName(DateTime.Today.DayOfWeek)}");

            // 指定中華民國曆
            ci.DateTimeFormat.Calendar = new TaiwanCalendar();
            Console.WriteLine($"     中華民國曆:{ci.DateTimeFormat.GetDayName(DateTime.Today.DayOfWeek)}");

            // 指定西曆 (英文)
            ci.DateTimeFormat.Calendar = new GregorianCalendar() { CalendarType = GregorianCalendarTypes.USEnglish };
            Console.WriteLine($"     西曆(英文):{ci.DateTimeFormat.GetDayName(DateTime.Today.DayOfWeek)}");
        }
    }
}

[C#] 文化特性的日曆清單-4

zh-tw 的 CultureInfo.DateTimeFormat.Calendar 只接受上述三種日曆,故意塞農民曆 TaiwanLunisolarCalendar 進去,會拋出 ArgmentOutOfRangeException

[C#] 文化特性的日曆清單-3

沒有留言:

張貼留言