Как управлять появление ':' в смещении часового пояса при синтаксическом анализе / форматировании Datetime

Я полагаю, что можно скомпилировать с

-Wno-unknown-pragmas

для подавления их.

12
задан JadeMason 9 March 2011 в 15:18
поделиться

1 ответ

У меня был точно тот же самый выпуск , пытаясь форматировать/анализировать часовой пояс в формате как +0730.

Форматирование DateTime с zzz будет всегда выходное смещение времени в hh:mm формат. Первоначально я, хотя это должно быть возможно получить пользовательский формат путем переопределения DateTimeFormatInfo.TimeSeparator (: по умолчанию), но в случае часового пояса это - hardcoded в [1 115] System.DateTimeFormat.FormatCustomizedTimeZone :

// 'zzz*' or longer format e.g "-07:30"
result.AppendFormat(CultureInfo.InvariantCulture, ":{0:00}", offset.Minutes);

Вот ответ из инженера, работающего над.NET:

zzz отформатирован как отрезок времени и не обычный DateTime. Это было решено со дня один для использования стандартного формата для форматирования части часового пояса в объектах даты/времени. Так, это является намеренным всегда использование: как разделитель для форматирования части отрезка времени. Я понимаю, что можно обсудить это не корректное решение, но мы не можем изменить это теперь, когда объем повреждения будет очень большим, поскольку многие люди зависят от парсинга дат, принимающих этот формат. Вы можете все еще обходное решение эта проблема путем замены: с желаемым разделителем Вы хотите.

Так вот моя версия как к пользовательскому форматированию часового пояса:

    var utcOffset = dateTime.Kind == DateTimeKind.Utc? TimeSpan.Zero : TimeZoneInfo.Local.GetUtcOffset(dateTime);
    var utcOffsetSrt = (utcOffset < TimeSpan.Zero ? "-" : "+") + utcOffset.ToString("hhmm", CultureInfo.InvariantCulture);
    var dateTimeStr = dateTime.ToString("yyyyMMddHHmmss", CultureInfo.InvariantCulture);
    var result = dateTimeStr + utcOffsetSrt;

Парсинг однако работы из поля с [1 110] для пустого разделителя:

var result = DateTime.ParseExact("+0000", "zzz", customInvariantCulture);
var resultOffset = TimeZoneInfo.Utc.GetUtcOffset(result.ToUniversalTime());
Assert.AreEqual(offset, resultOffset);

Изучение System.DateTimeParse.ParseTimeZoneOffset :

if (str.Match(":"))
{
    // Found ':'
    if (!ParseDigits(ref str, 2, out minuteOffset))
    {
        return false;
    }
}

Так zzz будет работать, только если у Вас нет разделителя или когда это :.

0
ответ дан 2 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: