Форматирование DateTime: почему не Тошорттимэстринг и «{0:t}» отображают одно и то же?

#c# #datetime

#c# #datetime

Вопрос:

 var todayAt2PM = new DateTime(
    DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 14, 0, 0);
Debug.Print("{0:t}", todayAt2PM);
Debug.Print("{0}", todayAt2PM.ToString("t"));
Debug.Print("{0}", todayAt2PM.ToShortTimeString());
  

Когда я запускаю это в C #, я получаю:

14:00
14:00
14:00

CultureInfo.CurrentCulture и CultureInfo.CurrentUICulture оба имеют значение «en-US» на моем компьютере. Я не делал никаких настроек в своих региональных настройках; когда я захожу в эту часть панели управления, все указывает 12-часовое время, с AM и PM.

Итак, почему «{0: t}» печатается с использованием 24-часового времени?

Комментарии:

1. DateTime.Today.AddHours(14)

2. @SLaks: Что этот комментарий должен нам сказать?

3. @Daniel: Это гораздо более короткая версия его второй строки

4. @SLaks: Да, вы правы. В следующий раз, пожалуйста, добавьте хотя бы небольшую подсказку в свой код 😉

Ответ №1:

Я думаю, проблема в Debug.Print , а не в t спецификаторе формата. Если вы используете Console.WriteLine вместо Debug.Print , это дает ожидаемый результат.

РЕДАКТИРОВАТЬ: только что посмотрел с помощью Reflector… Debug.Print всегда используется инвариантный язык, а не текущий язык, и формат времени в этом языке равен 24 часам

 [Conditional("DEBUG")]
public static void Print(string format, params object[] args)
{
    TraceInternal.WriteLine(string.Format(CultureInfo.InvariantCulture, format, args));
}