Как преобразовать текст смещения часового пояса "+01: 00" в интервал времени - PullRequest
1 голос
/ 23 декабря 2019

У меня есть API, который будет принимать смещение часового пояса в виде строки. Мне нужно преобразовать часовой пояс в TimeSpan и добавить временной интервал с данными, которые у меня есть, которые находятся в UTC. Вот что я пытаюсь сделать.

private bool TryGetHrAndMinFromTimeZone(string timeZone, out TimeSpan result)
    {
        try
        {
            var isPositive = !timeZone.StartsWith("-");
            var hrAndMin = string.Concat(timeZone.Where(x => x != '-' && x != '+')).Split(':');
            var hr = int.Parse(hrAndMin[0]);
            var min = int.Parse(hrAndMin[1]);
            result = isPositive ? new TimeSpan(hr, min, 0) : new TimeSpan(-hr, -min, 0);
            return true;
        }
        catch (Exception)
        {
            throw new Exception(string.Format("Provided TimeZone '{0}' is Invalid ", timeZone));
        }
    }

Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 23 декабря 2019

Тип DateTimeOffset может анализировать смещения этого формата, используя спецификатор zzz. Таким образом, вы можете написать такую ​​функцию, как:

static TimeSpan ParseOffset(string s)
{
    return DateTimeOffset.ParseExact(s, "zzz", CultureInfo.InvariantCulture).Offset;
}

Другой подход, вы можете разобрать с TimeSpan.ParseExact, если сначала уберите знак и обработаете его самостоятельно:

static TimeSpan ParseOffset(string s)
{
    var ts = TimeSpan.ParseExact(s.Substring(1), @"hh\:mm", CultureInfo.InvariantCulture);
    return s[0] == '-' ? ts.Negate() : ts;
}

Или, как показал Маниш в своем ответе, вы можете TimeSpan.Parse попытаться выяснить строку. Работает, если сначала убрать знак +.

static TimeSpan ParseOffset(string s)
{
    return TimeSpan.Parse(s.Replace("+", ""), CultureInfo.InvariantCulture);
}
1 голос
/ 23 декабря 2019

Вы можете попробовать

TimeSpan.TryParse("-07:00", out TimeSpan ts) //for -07:00
TimeSpan.TryParse("07:00", out TimeSpan ts) //for +07:00

для получения дополнительной информации https://docs.microsoft.com/en-us/dotnet/standard/datetime/converting-between-time-zones#converting-datetimeoffset-values

...