如何将时区偏移文本"+01:00"转换为时间跨度

5
我有一个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));
        }
    }

有更好的方法来做吗?


1
嘿,试试这个 --> TimeSpan.TryParse("-07:00", out TimeSpan ts) - Manish
2个回答

3

感谢您的输入。它可以很好地处理负时区偏移量。但是对于正时区偏移量则无法正常工作。您能否提供相关输入信息? - Akbar Badhusha
1
@AkbarBadhusha 从字符串中删除加号(+)符号。 - Manish

3

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接