2013-10-01 3 views
3

Я бегу следующий код в Xamarin студии (v4.0.12 - Mono 3.2.3) в GMT timeszone ...Is ToLocalTime сломан на Xamarin?

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

... но обе переменные возвращают значение «3:00:00 ВЕЧЕРА".

Если я запускаю тот же код в .NET 4.0, то вторая переменная - «4:00:00 PM». Это то, чего я ожидал бы.

Я не уверен, что мне не хватает, если это не будет одинаковым в обоих случаях?

DateTime, возвращенный из «ToLocalTime()», идентичен оригиналу, за исключением того, что «Вид» теперь «Локальный».

UPDATE:

Это, безусловно, связано с годом в приведенном выше примере. Если введен текущий год, то времена разные (и правильные), если что-либо до 1970 года, тогда часовой пояс игнорируется.

Вот копия моей информации временной зоны на основе кода в 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 

ответ

0

Похоже, вы с помощью летнего времени.

GMT - это почти то же самое, что и UTC (GMT на основе солнечной энергии, в то время как UTC основано на атомных часах), но поскольку ни одно летнее время не должно быть одинаковым.

Проблема, вероятно, в том, что вы не используете GMT ​​на вашем компьютере под управлением Windows, а вместо этого используете другой часовой пояс, соответствующий летнему времени.

+0

Я нахожусь в Великобритании в настоящее время BST (GMT +1), и моя машина окна установлен правильно. –

+0

Мой вопрос в том, что Mono также должен быть осведомлен о часовом поясе, но не кажется. И моно, и.чистый отчет, текущий часовой пояс SummerTime - BST –

+0

. Я получаю правильное смещение для моего TZ (Центральная США), на 5 часов позади GMT. – Jason

2

Проверив DateTime исходный код Mono, мы можем видеть ToLocalTime вызов использует TimeZone.CurrentTimeZone выполнить преобразование,

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

Таким образом, для устранения этой проблемы вы встречаетесь, вы можете распечатать TimeZone.CurrentTimeZone в обоих (iOS и Windows), чтобы увидеть, есть ли существенная разница.

Случай Windows правильный, поскольку .NET 4 обращается к базовой системе Windows, чтобы найти правильный часовой пояс (с полной поддержкой DST).

Дело Xamarin.iOS затруднено, так как мы не уверены, предоставит ли iOS правильную информацию о часовом поясе и правильно ли использует Xamarin.iOS.

0

Хотя исправление разрабатывается на эту ошибку, вы можете использовать этот обходной путь для DateTime.ToLocalTime():

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

+0

Как упоминалось в https://bugzilla.xamarin.com/show_bug.cgi?id=15134#c6, это обходное решение не работает –

0

Попробуйте этот обходной метод расширения

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))); 
    } 
} 
Смежные вопросы