Форматирование 12/24 часа в зависимости от культуры .net

Есть ли способ сохранить форматирование даты и времени для конкретной культуры, но принудительно отображать 12/24 часа? Я знаю, что могу многое сделать с фактической строкой формата даты/времени, такой как HH:mm:ss и hh:mm:ss, но я хотел бы соблюдать текущее форматирование культуры пользователя (т.


person TravisWhidden    schedule 10.11.2011    source источник


Ответы (4)


Я бы, наверное, сделал что-то вроде этого:

        var culture = CultureInfo.CurrentCulture;
        var pattern = culture.DateTimeFormat.LongTimePattern; // or pick which one you want to use;
        var newPattern = pattern.Replace("h", "H").Replace("t", "");
        DateTime.Now.ToString(newPattern); // or use whatever DateTime you want to use

Из чата:

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

Old: hh:mm:ss tt New: HH:mm:ss 
Old: HH:mm:ss 'ч.' New: HH:mm:ss 'ч.'
Old: HH:mm:ss New: HH:mm:ss
Old: H:mm:ss New: H:mm:ss
Old: h:mm:ss tt New: H:mm:ss 
Old: tt h:mm:ss New:  H:mm:ss
Old: h:mm:ss.tt New: H:mm:ss.
Old: HH.mm.ss New: HH.mm.ss
Old: tt hh:mm:ss New:  HH:mm:ss
person McKay    schedule 10.11.2011
comment
+1: это может сработать. Любопытно посмотреть, как он реагирует на манипулирование форматом времени в некоторых культурах. - person James Johnson; 11.11.2011
comment
Сейчас я делаю некоторые тесты, но я думаю, что это то, что я искал. Я скоро приму ответ, если это сработает. Спасибо.... - person TravisWhidden; 11.11.2011
comment
МакКей, похоже, это сработает для меня. Я ценю время, потраченное на чтение того, что я написал, и на самом деле обдумывание решения. Замена также является простым и легким подходом. Я отмечу это как ответ. - person TravisWhidden; 11.11.2011
comment
Не забудьте добавить Trim() после замены, чтобы избежать начальных и конечных пробелов, оставшихся после удаления tt. - person Nigel Touch; 30.01.2015

Вы можете использовать строки пользовательского формата даты/времени, например:

Для 12-часового рендеринга:

DateTime.Now.ToString("hh:mm:ss tt");

для 24-часового рендеринга:

DateTime.Now.ToString("HH:mm:ss");

Чтобы объединить формат даты из текущего языка и региональных параметров, вы можете использовать один из следующих способов:

DateTime.Now.ToString("d") + DateTime.Now.ToString(" hh:mm:ss tt");
DateTime.Now.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern + 
                                      " hh:mm:ss tt");
person Joe    schedule 10.11.2011
comment
Он специально заявил, что хочет в основном сохранить текущую культуру. - person McKay; 11.11.2011

Это зависит от того, о каких культурах вы говорите. Некоторые культуры не принимают 24-часовое время, а другие не принимают AM/PM. Самый безопасный выбор, вероятно, InvariantCulture.

person James Johnson    schedule 10.11.2011
comment
Он специально заявил, что хочет соблюдать текущую культуру, за исключением 24-часовых строк. - person McKay; 11.11.2011
comment
Он сказал, что хочет принудительно рендерить 12/24 часа, но уважать культуру ... не уверен, что вы имеете в виду. - person James Johnson; 11.11.2011
comment
Насколько я понял, он хочет использовать формат даты, свойственный культуре, но форматировать время в формате hh или HH, который может работать или не работать в зависимости от культуры. - person James Johnson; 11.11.2011
comment
Он сказал, что хочет сохранить все то же самое в текущей культуре (слэши, порядок месяца/дня/года), но заставить 24-часовой рендеринг. Например, он хочет нарушить только одно правило текущей культуры (12/24 часа). В остальном оставьте все как есть. - person McKay; 11.11.2011
comment
Смотрите мой ответ, чтобы понять, что я думаю, что он имеет в виду. - person McKay; 11.11.2011
comment
Да, но в зависимости от выбранной культуры это может быть невозможно. Я бы хотел, чтобы здесь был Джон Скит, потому что он мог бы привести примеры стран, для которых это может вызвать проблемы. - person James Johnson; 11.11.2011
comment
давайте продолжим это обсуждение в чате - person McKay; 11.11.2011

Используйте DateTime.ToShortTimeString(), чтобы получить версию, подходящую для вашей культуры. Примечание. По умолчанию он использует текущие настройки культуры потока.

Пример (из MSDN):

// This code example demonstrates the DateTime.ToLongDateString(),
// DateTime.ToLongTimeString(), DateTime.ToShortDateString(), and
// DateTime.ToShortTimeString() methods.

using System;
using System.Threading;
using System.Globalization;

class Sample 
{
    public static void Main() 
    {
    string msg1 = "The date and time patterns are defined in the DateTimeFormatInfo \n" +
                  "object associated with the current thread culture.\n";

// Initialize a DateTime object.
    Console.WriteLine("Initialize the DateTime object to May 16, 2001 3:02:15 AM.\n");
    DateTime myDateTime = new System.DateTime(2001, 5, 16, 3, 2, 15);

// Identify the source of the date and time patterns.
    Console.WriteLine(msg1);

// Display the name of the current culture.
    CultureInfo ci = Thread.CurrentThread.CurrentCulture;
    Console.WriteLine("Current culture: \"{0}\"\n", ci.Name);

// Display the long date pattern and string.
    Console.WriteLine("Long date pattern: \"{0}\"", ci.DateTimeFormat.LongDatePattern);
    Console.WriteLine("Long date string:  \"{0}\"\n", myDateTime.ToLongDateString());

// Display the long time pattern and string.
    Console.WriteLine("Long time pattern: \"{0}\"", ci.DateTimeFormat.LongTimePattern);
    Console.WriteLine("Long time string:  \"{0}\"\n", myDateTime.ToLongTimeString());

// Display the short date pattern and string.
    Console.WriteLine("Short date pattern: \"{0}\"", ci.DateTimeFormat.ShortDatePattern);
    Console.WriteLine("Short date string:  \"{0}\"\n", myDateTime.ToShortDateString());

// Display the short time pattern and string.
    Console.WriteLine("Short time pattern: \"{0}\"", ci.DateTimeFormat.ShortTimePattern);
    Console.WriteLine("Short time string:  \"{0}\"\n", myDateTime.ToShortTimeString());
    }
}

/*
This code example produces the following results:

Initialize the DateTime object to May 16, 2001 3:02:15 AM

The date and time patterns are defined in the DateTimeFormatInfo
object associated with the current thread culture.

Current culture: "en-US"

Long date pattern: "dddd, MMMM dd, yyyy"
Long date string:  "Wednesday, May 16, 2001"

Long time pattern: "h:mm:ss tt"
Long time string:  "3:02:15 AM"

Short date pattern: "M/d/yyyy"
Short date string:  "5/16/2001"

Short time pattern: "h:mm tt"
Short time string:  "3:02 AM"

*/
person Frazell Thomas    schedule 10.11.2011
comment
Он специально заявил, что хочет немного изменить нынешнюю культуру. - person McKay; 11.11.2011
comment
@McKay Мне показалось, что он просто хотел отобразить его в режиме 12/24 на основе культуры пользователя, но фрагмент MSDN и ваш ответ показывают, как получить базовый шаблон для манипуляции. - person Frazell Thomas; 11.11.2011
comment
так как же: DateTime.ToShortTimeString() отображает его в формате 12/24 на основе культуры пользователя? - person McKay; 11.11.2011
comment
@McKay Он настраивал культуру потока в соответствии с культурой пользователя перед вызовом метода ... Не уверен, что понимаю ваш вопрос. - person Frazell Thomas; 11.11.2011
comment
Точно, я думаю, это был его вопрос? - person McKay; 11.11.2011