C#创建代表台湾日期的DateTime对象2月29日101(闰日)

时间:2012-03-13 15:37:49

标签: c# datetime calendar

我无法创建一个DateTime对象,在C#中存储日期02/29/101(台湾日期)而不更改Thread文化。

当我这样做时:

DateTime date = new DateTime(2012, 2, 29, new TaiwanCalendar());

它创建一个DateTime对象,其日期为1911年。看来这个重载是为了告诉DateTime对象你提供的是台湾日期,而不是你想要一个台湾日期。

我可以这样做

DateTime leapDay = new DateTime(2012, 2, 29);

string date = string.Format("{0}/{1}/{2}", new TaiwanCalendar().GetYear(leapDay), new TaiwanCalendar().GetMonth(leapDay), new TaiwanCalendar().GetDayOfMonth(leapDay));

但这是一个字符串表示,我的调用代码需要返回一个DateTime对象,这个:

DateTime leapDay = new DateTime(2012, 2, 29);

DateTime date = new DateTime(new TaiwanCalendar().GetYear(leapDay), new TaiwanCalendar().GetMonth(leapDay), new TaiwanCalendar().GetDayOfMonth(leapDay));

不起作用(我收到一条错误,说“年,月,日参数描述了一个无法表示的DateTime。”)。

我需要一个能够在不改变线程文化的情况下准确表示台湾日期的DateTime对象。这有效:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("zh-TW");
Thread.CurrentThread.CurrentCulture.DateTimeFormat.Calendar = new TaiwanCalendar();

DateTime date = new DateTime(2012, 2, 29);

但是一旦我将线程文化更改回en-US,日期会自动更改,这会阻止我将其作为台湾日期返回。

有没有办法做到这一点,或者我是否必须以字符串的形式传递我的约会对象?

2 个答案:

答案 0 :(得分:7)

基本上,公历中的

DateTime总是。 (要么就是这样,或者你可以认为它们总是处于“中立”状态,但是属性将这个值解释为格里高利历中的那个。)在台历中没有“A DateTime” - 您以特定方式使用TaiwanCalendar 解释 DateTime

如果您需要使用特定日历格式化 DateTime,您可以创建相应的CultureInfo并将其传递给ToString方法。例如:

using System;
using System.Globalization;

class Test
{
    static void Main()        
    {
        var calendar = new TaiwanCalendar();
        var date = new DateTime(101, 2, 29, calendar);
        var culture = CultureInfo.CreateSpecificCulture("zh-TW");
        culture.DateTimeFormat.Calendar = calendar;       

        Console.WriteLine(date.Year); // 2012
        Console.WriteLine(date.ToString(culture)); // 101/2/29 [etc]
        Console.WriteLine(date.ToString("d", culture)); // 101/2/29
    }
}

编辑:正如xanatos所述,您可能还需要考虑Calendar.ToDateTime。 (我想说要考虑使用Noda Time,但我们还不支持这个日历。当我们这样做时...)

答案 1 :(得分:1)

 var timeToConvert = DateTime.Now;  //whereever you're getting the time from
 var est = TimeZoneInfo.FindSystemTimeZoneById("Taipei Standard Time");
 return TimeZoneInfo.ConvertTime(timeToConvert, est).ToString("MM-dd-yyyy");