我无法创建一个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,日期会自动更改,这会阻止我将其作为台湾日期返回。
有没有办法做到这一点,或者我是否必须以字符串的形式传递我的约会对象?
答案 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");