views:

1706

answers:

2

I have a problem with time
My server is in the USA and I'm in Denmark (Europa) and I would like to have my site show the time in my local time. How can I do that?

I try this

Datetime localtime = DateTimeOffset.Now.ToOffset(new TimeSpan(1,0,0)).DateTime;

and it works, but it will only work when I'm in GMT+1 / UTC+1 and not when I'm in GMT+2 / UTC+2. Is there another way of doing this - a simpler way of doing it?

A: 

You can get the time off the server and do this.

DateTime myTimeGMT = ServerTime.ToUniversalTime();

This do this:

DateTime myTimeLocal = myTimeGMT.ToLocalTime();

The only restriction here is the computer you are on must be set to the time zone you are converting to.

In my experience, .NET has trouble converting between timezones when neither the 'From' time or the 'To' time are the local time zone.

I hope this helps.

Loki Stormbringer
DateTime myTimeLocal = myTimeGMT.ToLocalTime();that will convert it back to servertime
Subnus
You need to look at the TimeZoneInfo class for performing the conversions. The conversion you show is ignorant of DST issues.
Robert Paulson
+4  A: 

The only way you should do it is as follows:

string zoneId = "Central European Standard Time";
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(zoneId);
DateTime result = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow,tzi);
Console.WriteLine("Time is " + result + " in Denmark");

Using the TimeZoneInfo class is the only reliable way in .Net to convert to/from different timezones AND get proper DST conversions.

TimeZoneInfo.ConvertTimeToUtc(dtLocal,tzi) is the reverse converting from a local time to a utc time.


For the TimeZone Id strings, you can run the bit of code here...

foreach( var tz in TimeZoneInfo.GetSystemTimeZones() )
{
    Console.WriteLine(tz.DisplayName + " is Id=','" + tz.Id + "'");
}
Robert Paulson
It should be noted that TimeZoneInfo correctly takes DST differences into account for future and past times as well. Don't be tempted to do the conversions yourself using BaseUtcOffset or GetUtcOffset(). You can also check for invalid and ambiguous times using TimeZoneInfo.
Robert Paulson