C# 如何将时区偏移文本“+01:00”转换为timespan

C# 如何将时区偏移文本“+01:00”转换为timespan,c#,timezone,timespan,C#,Timezone,Timespan,我有一个API,它将接受时区偏移量作为字符串。我需要将时区转换为TimeSpan,并使用UTC中的数据添加TimeSpan。这就是我正在尝试的 private bool TryGetHrAndMinFromTimeZone(string timeZone, out TimeSpan result) { try { var isPositive = !timeZone.StartsWith("-"); var

我有一个API,它将接受时区偏移量作为字符串。我需要将时区转换为TimeSpan,并使用UTC中的数据添加TimeSpan。这就是我正在尝试的

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));
        }
    }
有更好的选择吗?

你可以试试

TimeSpan.TryParse("-07:00", out TimeSpan ts) //for -07:00
TimeSpan.TryParse("07:00", out TimeSpan ts) //for +07:00
有关详细信息,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;
}
或者,正如Manish在回答中所示,您可以让TimeSpan.Parse尝试找出字符串。如果您先删除+符号,它就会工作

static TimeSpan ParseOffset(string s)
{
    return TimeSpan.Parse(s.Replace("+", ""), CultureInfo.InvariantCulture);
}

嘿,试试这个->TimeSpan.TryParse-07:00,out TimeSpan ts谢谢你的输入。它与-ve时区偏移配合得很好。但不能使用+ve时区偏移。你能提供一个输入吗?@akbaradhusha从字符串中删除加号。