Получить части даты из значения NSDate - PullRequest
5 голосов
/ 03 августа 2010

Я использую UIDatePicker, и у меня возникают проблемы с преобразованием этих данных в значение System.DateTime в MonoTouch. Существуют проблемы с преобразованием NSDate в DateTime, которые я в основном решил, но теперь я вижу, что если вы выберете дату, которая НЕ находится в том же периоде перехода на летнее время, то у вас будет час отдыха. Например, если я выберу дату в январе 2010 года, у меня возникнет проблема смещения.

Что я хотел бы сделать, так это когда пользователь выбирает дату / время из UIDatePicker, чтобы получить значения года, месяца, дня, часа и минут NSDate и просто создать новый System.DateTime с этими значений, и я всегда буду уверен, что получим значение даты точно так, как его видит пользователь в UIDatePicker.

Как я могу разбить значение NSDate на различные части даты?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 19 марта 2011

Простой способ избавиться от проблем с переходом на летнее время - установить часовой пояс по Гринвичу.Тогда UIDatePicker будет игнорировать летнее время:

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

Неявное преобразование NSDate в DateTime и из него в Monotouch достаточно хорошо, но вы должны знать, что NSDate всегда является временем UTC, а DateTime по умолчанию установлено вDateTimeKind.Unspecified (при чтении из базы данных) или 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);

Это проще и надежнее, чем получение отдельных значений Day, Month и Year.

1 голос
/ 03 февраля 2011
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 World :), затем с помощью> DateTimeToNSDate вы можете вернуть его в NSDate

hopeэто помогает

Алекс

1 голос
/ 03 августа 2010

Похоже, это можно сделать с помощью экземпляра NSDateComponents. Следующее было скопировано из Компоненты даты и единицы календаря :

Разложить дату на составную компоненты, вы используете NSCalendar Компоненты метода: fromDate :. В дополнение к самой дате, вам нужно указать компоненты, которые будут возвращается в 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];
...