2010-08-02 66 views
5

我正在使用UIDatePicker,並且在將此數據轉換爲MonoTouch中的System.DateTime值時遇到了問題。從NSDate到DateTime的轉換都存在問題,我已經解決了這個問題,但現在我發現,如果您選擇的日期不在相同的夏令時期間,那麼您將需要一個小時。例如,如果我在2010年1月選擇了一個日期,我會有一個抵消問題。從NSDate值獲取日期零件

我想要做的是,當用戶從UIDatePicker中選擇一個日期/時間是獲得NSDate的Year,Month,Day,Hour和Minute值,並創建一個新的System.DateTime這些值和我將永遠保證得到一個日期值,就像用戶在UIDatePicker中看到的一樣。

如何將NSDate值分解爲各個日期部分?

謝謝。

+0

如果任何人都可以幫助我找出使用MonoTouch的NSDateComponents,我會很感激。我還沒有想出如何做到這一點。示例代碼將不勝感激。謝謝! – Neal 2010-08-28 20:08:46

回答

2

看來這可以通過使用NSDateComponents的實例來完成。下面從Date Components and Calendar Units已被複制:

分解日期爲組成 組件,您使用NSCalendar 方法組成:FROM日期:。在 除了日期本身之外,您需要 來指定組件爲 返回的NSDateComponents 對象。爲此,該方法採用由日曆單元 常量組成的 位掩碼。沒有必要指定 以上的組件,而不是您感興趣的 中的組件。清單3 顯示瞭如何計算今天的工作日和工作日的 。

清單3獲取日期的組件

NSDate *today = [NSDate date]; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *weekdayComponents = [gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today]; 
NSInteger day = [weekdayComponents day]; 
NSInteger weekday = [weekdayComponents weekday]; 
1
public static DateTime NSDateToDateTime(MonoTouch.Foundation.NSDate date) 
{ 
    return (new DateTime(2001,1,1,0,0,0)).AddSeconds(date.SecondsSinceReferenceDate); 
} 

public static MonoTouch.Foundation.NSDate DateTimeToNSDate(DateTime date) 
{ 
    return MonoTouch.Foundation.NSDate.FromTimeIntervalSinceReferenceDate((date-(new DateTime(2001,1,1,0,0,0))).TotalSeconds); 
} 

好使用上面的代碼,你可以打開的NSDate成一個DateTime的做你的.NET環境:)正常嗎然後用> DateTimeToNSDate您可以將其還原爲NSDate

希望這可以幫助

Alex

4

擺脫夏令時問題的簡單方法是將時區設置爲GMT。然後的UIDatePicker將忽略夏令時:

_datePicker.TimeZone = NSTimeZone.FromAbbreviation("GMT"); 

的NSDate的隱式轉換和從日期時間是在MonoTouch的相當不錯,但你必須知道的NSDate始終是一個UTC時間和日期是默認設置爲DateTimeKind。未指定(從數據庫讀取時)或DateTimeKind.Locale(使用DateTime.Today設置時)。 無需複雜的時區計算轉換的最好辦法是強制權DateTimeKind:

// Set date to the date picker (_date is a DateTime with time part 0:00:00): 
    _datePicker.Date = DateTime.SpecifyKind(_date, DateTimeKind.Utc); 

    // Get the date from the date picker: 
    _date = DateTime.SpecifyKind(_datePicker.Date, DateTimeKind.Unspecified); 

這比獲得單獨日,月,年值更容易,更可靠。