C # Создание объекта DateTime, представляющего тайваньскую дату 29 февраля 101 (високосный день) - PullRequest
2 голосов
/ 13 марта 2012

У меня нет времени на создание объекта DateTime, который хранит дату 29.02.101 (тайваньская дата) в C # без изменения культуры потоков.

Когда я делаю это:

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, дата автоматически возвращается обратно, что не позволяет мне вернуть ее как тайваньскую дату.

Есть лиЕсть ли способ сделать это, или я собираюсь передать свою дату в виде строки?

1 Ответ

7 голосов
/ 13 марта 2012

DateTime значения всегда в григорианском календаре, в основном.(Либо так, либо вы можете думать, что они всегда "нейтральны", но свойства интерпретируют значение, как если бы оно было в григорианском календаре.) Нет такой вещи, как "A DateTime в тайваньском календаре" - вы используетеот TaiwanCalendar до интерпретировать a 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 вместо этого, но мы пока не поддерживаем этот календарь. Когда мы это делаем ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...