2010-11-24 61 views
3

我的代碼在模擬器中效果很好,但是在3gs設備上它與TimeZoneNotFoundException崩潰。時區總是返回TimeZoneNotFoundException

我的代碼的原因是將服務器時間(在CET中給出)轉換爲本地時區。

var t = TimeZoneInfo.FindSystemTimeZoneById(TimeZone.CurrentTimeZone.StandardName); 
//This line below crashes    
double localOffset = t.GetUtcOffset(DateTime.Now).TotalMilliseconds; 

本地時區在我的情況是CET。

任何想法爲什麼這不適用於Monotouch?這是MonoTouch的限制嗎?由於代碼在模擬器中工作,我看不到它是一個編程錯誤?我試圖重寫這個,但總是以相同的異常結束。也嘗試過「TimeZoneInfo.Local」,但是馬上給出錯誤。

任何幫助非常感謝!

+0

問題添加到GitHub https://github.com/chrisntr/Newtonsoft.Json/issues/issue/5 – 2011-02-13 03:18:47

回答

2

這是MonoTouch中的一個錯誤。

在iOS模擬器下,可以重新使用包含時區數據的文件(即與任何類UNIX系統提供的文件一樣)。但是這些文件無法從iOS設備訪問,導致TimeZoneNotFoundException

最近的MonoTouch版本(5.1.x iirc)正在從NSTimeZone數據初始化它們自己,因此.NET TimeZoneInfo將具有匹配的數據,無論iOS版本是什麼,該設備提供了什麼。

1

具有相同的問題,儘管我的起源是Newtonsoft.Json試圖序列化一個DateTime(並且想要獲得UTC偏移量)。堆棧跟蹤表明它調用了TimeZoneInfo.Local,它引發了一個異常在設備上(但不是仿真器)。

1

我剛發現一個解決方法。我不得不重新編譯newtonsoft JSON具有以下變化到DateTimeUtils.cs

更改GetLocalOffset(這個日期時間d)函數簡單地使用 UTCOFFSET = TimeZoneInfo.Local.GetUtcOffset(d);

而不是TimeZone.Local

+0

我放棄了,並在我自己的代碼中實現了這個解決方法。像這樣的問題讓我懷疑MonoTouch,但我想我總是可以寫一些針對objective-c的綁定。 – 2011-01-16 15:53:27

+0

對不起,我沒有看到這個*舊*的帖子,然後再推特給我。當您遇到崩潰或模擬器和設備之間的不同行爲時,請隨時打開錯誤報告 - > http://bugzilla.xamarin.com – poupou 2012-01-18 23:00:15

1

我有與設備構建相同的問題。我通過設置這個屬性解決了它(在移動端)。序列化現在工作得很好。

[JsonConverter(typeof(IsoDateTimeConverter))]
public DateTime? MyEndTime {get;組; }

享受!

+0

對不起,從MonoDevelop複製/粘貼不會導致漂亮的格式化。噓。 – HatAndBeard 2011-03-08 17:00:41