Как создать объект DateTime не в текущей культуре - PullRequest
4 голосов
/ 29 июля 2010

Я действительно рисую пробел на этом. Я работал над глобализацией, но DateTime, кажется, всегда возвращается к культуре CurrentThread. Я разбил это на более мелкие шаги, надеясь найти мою проблему, но это начинает сводить меня с ума.

У меня есть текстовое поле с датой в виде строки:

        // the CurrentThread's culture is de-DE
        // My test browser is also set to de-DE
        IFormatProvider culture = new System.Globalization.CultureInfo("de-DE", 
               true);

        // en-US culture, what I'd ultimately like to see the DateTime in
        IFormatProvider us_culture = new System.Globalization.CultureInfo("en-US", 
               true);

        // correctly reads the textbox value (22.7.2010 into a datetime)
        DateTime dt= DateTime.Parse(txtStartDate.Text, culture, 
                System.Globalization.DateTimeStyles.NoCurrentDateDefault);

        // correctly produces a string 7/22/2010
        string dt2 = dt.ToString(us_culture);

На данный момент я хочу DateTime, который находится в en-US Я пробовал оба:

        DateTime dt3 = Convert.ToDateTime(dt2, us_culture); 
        DateTime dt3 = DateTime.Parse(dt2, us_culture);

Но оба производят de-DE DateTimes. Моя мотивация при задании этого вопроса заключается в том, что остальная часть бизнес-логики будет вызывать dt2.toString () и приведет к неправильной строке даты и времени. Я понимаю, что мог бы изменить toString () на toString (us_culture), но я бы предпочел не изменять всю остальную бизнес-логику, чтобы учесть это изменение.

Есть ли способ получить DateTime в культуре, отличной от культуры CurrentThread?

Спасибо, что уделили мне время, я слишком долго бился об это.

Ответы [ 3 ]

4 голосов
/ 29 июля 2010

Объект DateTime - это просто дата и время, не зависящие от культуры. Вам нужно отформатировать даты, используя особую культуру, если вы к этому стремитесь.

2 голосов
/ 29 июля 2010

Параметр без перегрузки ToString () всегда выводит дату в соответствии с настройкой CurrentCulture. Это то, что вы хотите 99 раз из 100.

Если вы не хотите использовать перегрузку, вы можете вручную установить для CurrentThread.CurrentCulture то, что вам нужно.

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");

Но поймите, что это изменится для всего в вашем приложении.

1 голос
/ 29 июля 2010

попробуйте использовать пользовательский формат данных:

string dt2 = dt.ToString("m/d/yyyy");
...