NSDate - Изменить время компонента - PullRequest
0 голосов
/ 19 ноября 2009

Возможно, это глупый вопрос, но я не могу найти ответ.

Я использую средство выбора даты, чтобы позволить пользователю ввести дату, и оно также устанавливает текущее время (я запускаю средство выбора с помощью [Дата NSDate]).

Есть ли способ изменить временную составляющую даты? Позже я вычисляю интервалы времени, которые возвращают секунды, и из-за времени я получаю странное поведение.

Этот код показывает запись даты:

@implementation AddEventViewController
@synthesize backgroundColor, nameField, dateField, datePicker, eventName, eventDate;

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.view.backgroundColor = self.backgroundColor;   
}

- (void)viewDidLoad 
{
    [super viewDidLoad];
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];


    CGSize size = self.view.bounds.size;
    CGRect frame = CGRectMake(0, size.height - 216, 320, 216);
    datePicker = [[UIDatePicker alloc] initWithFrame: frame];
    datePicker.datePickerMode = UIDatePickerModeDate;
    datePicker.hidden = YES;
    datePicker.date = [NSDate date];
    [datePicker addTarget:self
                   action:@selector(changeDateInLabel:)
         forControlEvents:UIControlEventValueChanged];

    [self.view addSubview: datePicker];
}
- (void)didReceiveMemoryWarning 
{
    [super didReceiveMemoryWarning];
}

-(IBAction)doneButton
{
    if ((nameField.text != nil))
    {
        self.eventName = nameField.text;
        self.eventDate = datePicker.date;
        [[NSNotificationCenter defaultCenter]postNotificationName:@"EventAddDone" object:nil];
    }
    else
    {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Enter Event Name" message:nil delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    }   
}

-(IBAction)cancelButton
{
    [[NSNotificationCenter defaultCenter]postNotificationName:@"EventAddCancel" object:nil];

}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

- (void)changeDateInLabel:(id)sender
{
    dateField.text = [dateFormatter stringFromDate:[datePicker date]];
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{
    if(textField == dateField)
    {
        dateField.placeholder = @" ";
        dateField.text = [dateFormatter stringFromDate:[datePicker date]];
        datePicker.hidden = NO; 
        [nameField resignFirstResponder];
        return NO;
    }
    return YES;
}

- (void)dealloc 
{
    self.backgroundColor = nil;
    self.nameField = nil;
    self.dateField = nil;
    self.datePicker = nil;
    self.eventName = nil;
    self.eventDate = nil;
    [dateFormatter release];
    [super dealloc];
}
@end

Мое использование записанной даты похоже на следующее:

NSTimeInterval age = [enteredDate timeIntervalSinceNow];
//do some math on the age variable to get number of days since the event occurred. 

Ответы [ 2 ]

3 голосов
/ 19 ноября 2009

Два варианта:

Вариант 1:

int fromDate = [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit
                                                       inUnit:NSEraCalendarUnit
                                                      forDate:enteredDate];
int toDate =  [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit
                                                      inUnit:NSEraCalendarUnit
                                                     forDate:[NSDate date]];
int days = toDate - fromDate;

вариант 2:

NSDate *dateA, *dateB;
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit
                                startDate:&dateA
                                 interval:NULL
                                  forDate:enteredDate];

[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit
                                startDate:&dateB
                                 interval:NULL
                                  forDate:[NSDate date]];
//From here, apply the above method using components:fromDate:toDate:
//with dateA and dateB, which are set to the beginning of the days on
//which they lie.
2 голосов
/ 19 ноября 2009
NSInteger days = [[[NSCalendar currentCalendar] components:NSDayCalendarUnit
                                                  fromDate:enteredDate
                                                    toDate:[NSDate date]
                                                   options:0] day];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...