I think Live Writer will get me bloggin again. Anyway, here is a class that allows you to convert a DateTime to any Timezone. You can convert between local timezones and to/from UTC. It leverages Windows apis to do the conversion and uses the internal timezone structures.

namespace WJS.Utils{/// <summary>/// Date: 12/4/2005/// Created By: William Stacey, MVP/// Used to convert to/from utc times and local times and respect DST./// Can also covert between two local time zones./// Information about a time zone containing methods to convert local times to and from UTC and/// between local time zones./// </summary>[Serializable]public class TimeZoneInformation{#region Fieldsprivate TZI tzi; // Current time zone information.private string displayName; // Current time zone display name.private string standardName; // Current time zone standard name (non-DST).private string daylightName; // Current time zone daylight name (DST).private static readonly List<TimeZoneInformation> timeZones; // static list of all time zones on machine.#endregion

#region Public Properties/// <summary>/// Gets list of all time zones defined on the current computer system./// </summary>public static List<TimeZoneInformation> TimeZones{get{// Return a copy of the list.List<TimeZoneInformation> nList = new List<TimeZoneInformation>(timeZones);return nList;}}/// <summary>/// Gets an string array of standard time zone names supported on the current system./// </summary>public static string[] TimeZoneNames{get{List<String> list = new List<String>();foreach (TimeZoneInformation tzi in timeZones){list.Add(tzi.StandardName);}return list.ToArray();}}

/// <summary>/// Converts the value of the utc time to a local time in this time zone./// </summary>/// <param name="utc">The UTC time to convert.</param>/// <returns>The local time.</returns>public DateTime ToLocalTime(DateTime utc){// Convert to SYSTEMTIMESYSTEMTIME stUTC = DateTimeToSystemTime(utc);

/// <summary>/// Converts the value of the utc time to local time in supplied time zone./// </summary>/// <param name="utc">The time to convert.</param>/// <param name="targetTimeZoneName">The standard name of the time zone.</param>/// <returns>The local time.</returns>/// <exception cref="ArgumentException">Thrown if time zone not found.</exception>public static DateTime ToLocalTime(DateTime utc, string targetTimeZoneName){TimeZoneInformation tzi = TimeZoneInformation.GetTimeZone(targetTimeZoneName);return tzi.ToLocalTime(utc);}

/// <summary>/// Converts a localTime from a source time zone to a target time zone, adjusting for DST as needed./// The localTime must be a local time in the sourceTimeZoneName time zone./// </summary>/// <param name="sourceTimeZoneName">Time zone name which represents localTime.</param>/// <param name="localTime">The source local time.</param>/// <param name="targetTimeZoneName">The time zone name which to convert the localTime.</param>/// <returns>The local time for targetTimeZoneName.</returns>public static DateTime ToLocalTime(string sourceTimeZoneName, DateTime localTime, string targetTimeZoneName){DateTime utc = TimeZoneInformation.ToUniversalTime(sourceTimeZoneName, localTime);DateTime lt = TimeZoneInformation.ToLocalTime(utc, targetTimeZoneName);return lt;}

/// <summary>/// Converts the value of the local time to UTC time./// Note that there may be different possible interpretations at the daylight time boundaries./// </summary>/// <param name="local">The local time to convert.</param>/// <returns>The UTC DateTime.</returns>/// <exception cref="NotSupportedException">Thrown if the method failed due to missing platform support.</exception>public DateTime ToUniversalTime(DateTime local){SYSTEMTIME stLocal = DateTimeToSystemTime(local);TIME_ZONE_INFORMATION tziNative = TziNative();SYSTEMTIME stUTC;

// Could have sworn there’s a Marshal operation to pack bytes into// a structure, but I can’t see it. Do it manually.GCHandle h = GCHandle.Alloc(info, GCHandleType.Pinned);try{tzi = (TZI)Marshal.PtrToStructure(h.AddrOfPinnedObject(), typeof(TZI));}finally{h.Free();}}#endregion}}