¿ToLocalTime está roto en Xamarin?

Estoy ejecutando el siguiente código en Xamarin Studio (v4.0.12 – Mono 3.2.3) en la zona horaria GMT …

var utcDateTime = new DateTime(1970, 07, 15, 15, 00, 00, DateTimeKind.Utc); string utcTimeString = utcDateTime.ToLongTimeString(); string localTimeString = utcDateTime.ToLocalTime().ToLongTimeString(); 

… pero ambas variables devuelven el valor "3:00:00 PM".

Si ejecuto el mismo código bajo .NET 4.0, la segunda variable es "4:00:00 PM". Esto es lo que espero.

No estoy seguro de qué me estoy perdiendo, ¿no debería ser idéntico en ambos?

El DateTime devuelto desde 'ToLocalTime ()' es idéntico al original, excepto que 'Kind' ahora es 'Local'.

ACTUALIZAR:

Esto está definitivamente relacionado con el año en el ejemplo anterior. Si se ingresa el año actual, los times son diferentes (y correctos), si se ingresa algo antes de 1970, se ignora la zona horaria.

Aquí hay una copy de mi información de zona horaria basada en el código en http://msdn.microsoft.com/en-us/library/system.timezone.currenttimezone.aspx

 Standard time name: GMT Daylight saving time name: BST Current date and time: 2013-10-02 09:27 Daylight saving time? True Coordinated Universal Time: 2013-10-02 08:27 UTC offset: 01:00:00 Daylight saving time for year 1970: 0001-01-01 00:00 to 0001-01-01 00:00, delta: 00:00:00 1970 7/15/1970 3:00:00 PM 7/15/1970 3:00:00 PM 2005 7/15/2005 3:00:00 PM 7/15/2005 4:00:00 PM Now 10/2/2013 8:27:09 AM 10/2/2013 9:27:09 AM 

Al verificar el código fuente DateTime de Mono, podemos ver que la llamada ToLocalTime usa TimeZone.CurrentTimeZone para realizar la conversión,

https://github.com/mono/mono/blob/master/mcs/class/corlib/System/DateTime.cs

Por lo tanto, para solucionar este problema que conoce, puede imprimir TimeZone.CurrentTimeZone en ambos casos (iOS y Windows) para ver si hay alguna diferencia significativa.

El caso de Windows es correcto, porque .NET 4 accede al sistema Windows subyacente para localizar la zona horaria adecuada (con soporte DST completo).

El caso de Xamarin.iOS es difícil, ya que no estamos seguros de si iOS expone la información correcta de la zona horaria y si Xamarin.iOS lo consume correctamente.

Parece que estás listo para el verano.

GMT es más o less lo mismo que UTC (GMT es basado en energía solar mientras que UTC está basado en el reloj atómico), pero como ninguno tiene horario de verano, deberían ser idénticos a todos los efectos.

El problema es probable que no esté utilizando GMT en su máquina Windows, sino en otra zona horaria consciente del horario de verano.

Mientras se está trabajando en una solución para este error, puede usar esta solución temporal para DateTime.ToLocalTime ():

Datetime localdate = TimeZoneInfo.ConvertTime (utcdate, TimeZoneInfo.Utc, TimeZoneInfo.Local);

Pruebe este método de extensión de solución

 public static class DateTimeExtensions { public static DateTime ToLocalTimeX(this DateTime dateTime) { var info = TimeZoneInfo.Local; return dateTime.Add(info.BaseUtcOffset.Add(TimeSpan.FromHours(info.IsDaylightSavingTime(DateTime.Now) ? 1 : 0))); } }