C#创建一个DateTime对象,表示台湾日期101年2月29日(闰日)

本文关键字:日期 101年 2月 闰日 29日 表示 对象 创建 一个 DateTime | 更新日期: 2023-09-27 18:27:34

在不更改线程区域性的情况下,创建一个在C#中存储日期02/29/101(台湾日期)的DateTime对象时遇到了不可能的困难。

当我这样做时:

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

它创建了一个日期为1911年的DateTime对象。这个超负荷似乎是为了告诉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);

但一旦我将线程文化更改回美国,日期就会自动更改回,这使我无法将其作为台湾日期返回。

有没有办法做到这一点,或者我必须把我的约会当作一根绳子来传递?

C#创建一个DateTime对象,表示台湾日期101年2月29日(闰日)

DateTime值基本上在公历中总是。(要么是这样,要么你可以认为它们总是"中性"的,但属性对值的解释就像它在公历中一样。)没有"台湾日历中的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,但我们还不支持这个日历。当我们支持的时候…)

 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");