Форматы Utcoffset в C#

#c# #asp.net-mvc #datetime-format

#c# #asp.net-mvc #datetime-формат

Вопрос:

 var utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now);
Console.WriteLine(((utcOffset < TimeSpan.Zero) ? "-" : " ")   utcOffset.ToString("hhmm"));
  

Приведенный выше код работает нормально. Но мне нужно отобразить смещение, например, 05:00. Есть ли какой-либо способ достичь этого формата?

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

1. Просто использовать hh':'mm в качестве строки формата? Кроме того, используйте TimeZoneInfo вместо TimeZone .

2. Да, я пробовал это, но так не работает. Например, utcOffset. toString(«hh:mm»));

3. Прочитайте мой комментарий еще раз. Я не говорил hh:mm .

4. Например, консоль. WriteLine(((utcOffset. BaseUtcOffset <интервал времени.Ноль)? «-«: » «) utcOffset. Базовый utcoffset. Часы «:» utcOffset. Базовый utcoffset. Минут); // вывод 5:0, я пытаюсь использовать ваше предложение TimeZoneInfo, но мне нужно 05:00

5. Я имел в виду utcOffset.ToString("hh':'mm"));

Ответ №1:

Из документов:

Пользовательские спецификаторы формата временных интервалов не включают символы-разделители-заполнители, такие как символы, которые отделяют дни от часов, часы от минут или секунды от долей секунды. Вместо этого эти символы должны быть включены в строку пользовательского формата как строковые литералы.

Таким образом, вам нужно экранировать символ в вашей строке формата, которого нет в списке на странице выше, либо окружив его ' символом , либо обратной косой чертой, так что:

 utcOffset.ToString("hh':'mm")
  

Однако на самом деле вам не нужно делать это форматирование самостоятельно, если вы форматируете a DateTimeOffset , а не TimeSpan . Если вы сделаете это, вам также не понадобится вся эта путаница с «получением смещения UTC».

Вам просто нужен спецификатор пользовательского формата zzz:

 DateTimeOffset.Now.ToString("zzz")
  

Вам не нужны все TimeZone материалы.

Ответ №2:

Вместо того, чтобы использовать TimeZone для поиска часового пояса DateTime.Now , вы можете использовать DateTimeOffset.Now строку zzz формата и CultureInfo.InvariantCulture для достижения этой цели:

 Console.WriteLine(DateTimeOffset.Now.ToString("HHmmzzz", System.Globalization.CultureInfo.InvariantCulture));
// outputs 1255 02:00
  

Попробуйте онлайн

Если вам просто нужно смещение в этом формате, вы можете использовать "zzz" вместо "HHmmzzzz" .

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

1. Не могли бы вы уточнить свой ответ? Я не получаю тот же результат, что и ваш. В нем говорится, что входная строка была не в правильном формате. Спасибо.

2. Извините, я пропустил .Now . Можете ли вы попробовать еще раз?