Reputation: 81
I want to convert a datetime from one time zone to another. For this i need to pass the zone id to the method FindSystemTimeZoneById. But i do not have this information and need to determine that by using a switch-case.
Here i also need to take into account daylight saving. but in order to determine whether a time is in DST i need that zone id beforehand.
Is there any way to determine whether a time is in DST without the zone id. My server is in zone 1 and i want to convert the time to zone 2.
Here is the snippet:
public DateTime ConvertToDestTime(DateTime currentTime, string sourceTimeZoneUtc, string serverTimeZoneUtc)
{
TimeZoneInfo sourceTimeZone = TimeZoneInfo.FindSystemTimeZoneById(ReturnTimeZoneString(sourceTimeZoneUtc));
TimeZoneInfo serverTimeZone = TimeZoneInfo.FindSystemTimeZoneById(ReturnTimeZoneString(serverTimeZoneUtc));
DateTime serverTime = TimeZoneInfo.ConvertTime(currentTime, sourceTimeZone, serverTimeZone);
return serverTime;
}
private string ReturnTimeZone(string utcOffset)
{
string timezone = string.Empty;
string isDaylight = //need to determine whether time is in DST here
if (isDaylight == "N")
{
switch (utcOffset)
{
case "-04:00":
timezone = "Atlantic Standard Time";
break;
case "-05:00":
timezone = "Eastern Standard Time";
break;
}
}
else
{
switch (utcOffset)
{
case "-04:00":
timezone = "Eastern Standard Time";
break;
case "-05:00":
timezone = "Central America Standard Time";
break;
}
}
return timezone;
Upvotes: 0
Views: 3986
Reputation: 19
Jarek, there is missing method in your solution:
public static String GetShortName(this TimeZoneInfo info)
{
return info.DisplayName.Split('(')[1].Split(')')[0];
}
Upvotes: 0
Reputation: 61
A bit old question, but may be somebody will enjoy bellow extension
public static class DateTimeExtension
{
public static DateTime ConvertBetweenTimeZones(this DateTime d, string sourceTimeZone, string destinationTimeZone)
{
var tziSource = TimeZoneInfo.FindSystemTimeZoneById(sourceTimeZone);
var tziDestination = TimeZoneInfo.FindSystemTimeZoneById(destinationTimeZone);
var utcDate = TimeZoneInfo.ConvertTimeToUtc(d, tziSource);
return TimeZoneInfo.ConvertTimeFromUtc(utcDate, tziDestination);
}
}
And some unit test for that:
[TestClass]
public class DateTimeTests
{
[TestMethod]
public void ConvertBetweenTimeZonesTest()
{
var dateTime = new DateTime(2023, 1, 27, 21, 0, 0);
var sourceTimeZone = "Central European Standard Time";
var destTimeZone = "UTC-02";
var dateResult = dateTime.ConvertBetweenTimeZones(sourceTimeZone, destTimeZone);
var expectedDate = new DateTime(2023, 1, 27, 18, 0, 0);
Assert.AreEqual(expectedDate, dateResult);
}
}
[TestClass]
public class TimeZoneInfoTests
{
[TestMethod]
public void ConvertBetweenTimeZonesTest()
{
var timeZone = "Central European Standard Time";
var tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
Assert.AreEqual("UTC+01:00", tzi.GetShortName());
}
}
Upvotes: 1
Reputation: 433
Convert the source time to UTC time.
string sourceTimeZone="Atlantic Standard Time;
TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(sourceTimeZone);
DateTime sourceUTCTime = TimeZoneInfo.ConvertTimeToUtc(currentTime, timeZoneInfo);
then using the converted UTC time get the destination time as below,
string destinationTimeZone="India Standard Time";
TimeZoneInfo destTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(destinationTimeZone);
DateTime destinationUTCTime = TimeZoneInfo.ConvertTimeFromUtc(sourceUTCTime, destTimeZoneInfo);
Hope this helps!!!
Upvotes: 2
Reputation: 241420
You cannot perform this type of reverse mapping reliably. There are just two many possible time zones that any particular offset could fall into.
See "TimeZone != Offset" in the timezone tag wiki.
See also all the places that -04:00
might be used.
Lastly, recognize that because each time zone in North America falls-back in their own local time, some values are shared by two time zones at once.
For example, 2014-11-02T01:00:00-05:00
could belong to either US Central Time (CDT) or US Eastern Time (EST), as shown here.
Upvotes: 0
Reputation: 4632
Check ou t Microsoft's "timeless" article Coding Best Practices Using DateTime in the .NET Framework.
The article may be a few years old, but the priciples and problem scenarios are still today's topics.
There is a dedicated chapter about Dealing with Daylight Savings Time.
By converting your local time views to universal time prior to performing your calculations, you get past the issues of time accuracy.
So, convert your local time to UTC format first and then into the target time format.
Upvotes: 0