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);
但一旦我将线程文化更改回美国,日期就会自动更改回,这使我无法将其作为台湾日期返回。
有没有办法做到这一点,或者我必须把我的约会当作一根绳子来传递?
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");