Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert UTC/GMT time to local time

We are developing a C# application for a web-service client. This will run on Windows XP PC's.

One of the fields returned by the web service is a DateTime field. The server returns a field in GMT format i.e. with a "Z" at the end.

However, we found that .NET seems to do some kind of implicit conversion and the time was always 12 hours out.

The following code sample resolves this to some extent in that the 12 hour difference has gone but it makes no allowance for NZ daylight saving.

CultureInfo ci = new CultureInfo("en-NZ"); string date = "Web service date".ToString("R", ci); DateTime convertedDate = DateTime.Parse(date);             

As per this date site:

UTC/GMT Offset

Standard time zone: UTC/GMT +12 hours
Daylight saving time: +1 hour
Current time zone offset: UTC/GMT +13 hours

How do we adjust for the extra hour? Can this be done programmatically or is this some kind of setting on the PC's?

like image 279
rbrayb Avatar asked Oct 07 '08 19:10

rbrayb


People also ask

How do you convert UTC to local time?

(GMT-5:00) Eastern Time (US & Canada)Add the local time offset to the UTC time. For example, if your local time offset is -5:00, and if the UTC time is shown as 11:00, add -5 to 11. The time setting when adjusted for offset is 06:00 (6:00 A.M.).

Is UTC the same as GMT now?

Although both GMT and UTC display the same time, there is a difference: GMT is now considered just a time zone officially used in some European and African countries. But UTC is not a time zone, but rather the new time standard that is the basis for clock time and time zones worldwide.

How do I calculate local time from GMT?

(1) In above formulas, 9 is the number of hours the local time ahead to GMT, and you can change it as you need, if the local time is backward to the GMT, you just can change the plus sign + to minus sign -. (2) The formula =A2 + (9 / 24) will return a decimal number.


2 Answers

For strings such as 2012-09-19 01:27:30.000, DateTime.Parse cannot tell what time zone the date and time are from.

DateTime has a Kind property, which can have one of three time zone options:

  • Unspecified
  • Local
  • Utc

NOTE If you are wishing to represent a date/time other than UTC or your local time zone, then you should use DateTimeOffset.


So for the code in your question:

DateTime convertedDate = DateTime.Parse(dateStr);  var kind = convertedDate.Kind; // will equal DateTimeKind.Unspecified 

You say you know what kind it is, so tell it.

DateTime convertedDate = DateTime.SpecifyKind(     DateTime.Parse(dateStr),     DateTimeKind.Utc);  var kind = convertedDate.Kind; // will equal DateTimeKind.Utc 

Now, once the system knows its in UTC time, you can just call ToLocalTime:

DateTime dt = convertedDate.ToLocalTime(); 

This will give you the result you require.

like image 131
Drew Noakes Avatar answered Oct 16 '22 02:10

Drew Noakes


I'd look into using the System.TimeZoneInfo class if you are in .NET 3.5. See http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx. This should take into account the daylight savings changes correctly.

// Coordinated Universal Time string from  // DateTime.Now.ToUniversalTime().ToString("u"); string date = "2009-02-25 16:13:00Z";  // Local .NET timeZone. DateTime localDateTime = DateTime.Parse(date);  DateTime utcDateTime = localDateTime.ToUniversalTime();  // ID from:  // "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zone" // See http://msdn.microsoft.com/en-us/library/system.timezoneinfo.id.aspx string nzTimeZoneKey = "New Zealand Standard Time"; TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(nzTimeZoneKey); DateTime nzDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, nzTimeZone); 
like image 23
Daniel Ballinger Avatar answered Oct 16 '22 00:10

Daniel Ballinger