簡體   English   中英

如何將時區偏移文本“+01:00”轉換為時間跨度

[英]How to convert timezone offset text "+01:00" to timespan

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

有沒有更好的選擇來做到這一點?

你可以試試

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM