How to convert string offset to timespan in c#
c#, timespan, timezone
Solution
You can just use the `TimeSpan.Parse` method:
TimeSpan ts = TimeSpan.Parse("-07:00");
Console.WriteLine(ts); // -07:00:00
Be careful to strip a leading "+" as TimeSpan.Parse will fail here. "+01:00" is incorrect, but "01:00" works.
Or if you want be a little more safe, try the `TimeSpan.TryParse` method:
TimeSpan ts;
if (TimeSpan.TryParse("-07:00", out ts))
Console.WriteLine(ts); // -07:00:00
But of course if all you want to do is convert a UTC date/time to a local date/time, you can just do this:
DateTime localDateTime = utcDateTime.ToLocalTime();
Or to convert it to any timezone:
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc);
DateTime localDateTime = TimeZoneInfo.ConvertTime(utcDateTime, tzi);
Problem
I'm trying to convert the convert time to the user's time zone, but I don't have the windows time zone string such as "Pacific Standard Time". All I have is a string offset such as "-07:00". Looks like I need to create a timespan. Is the only way to parse this string manually?. Seems like there should be a way to convert a time using a string offset, but maybe I am missing something. I have this but it requires the timezone. I'm trying to modify it to use the offset instead, but you can see the timespan that is created for the conversion and I need to get my offset to the timespan. ``` static void Main(string[] args) { var currentTimeInPacificTime = ConvertUtcTimeToTimeZone(DateTime.UtcNow, "Pacific Standard Time"); //TimeSpan ts = new TimeSpan("-07:00"); Console.ReadKey(); } static DateTimeOffset ConvertUtcTimeToTimeZone(DateTime dateTime, string toTimeZoneDesc) { if (dateTime.Kind != DateTimeKind.Utc) throw new Exception("dateTime needs to have Kind property set to Utc"); TimeSpan toUtcOffset = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc).GetUtcOffset(dateTime); var convertedTime = DateTime.SpecifyKind(dateTime.Add(toUtcOffset), DateTimeKind.Unspecified); return new DateTimeOffset(convertedTime, toUtcOffset); } ```