Iphone NSDate-更改时间组件

Iphone NSDate-更改时间组件,iphone,objective-c,Iphone,Objective C,这可能是个愚蠢的问题,但我似乎找不到答案 我使用一个日期选择器允许用户输入日期,它还将时间设置为当前时间(我使用[NSDate date]初始化选择器) 有没有办法更改日期的时间成分?后来我计算了返回秒的时间间隔,由于时间的关系,我得到了一些奇怪的行为 此代码显示日期输入: @implementation AddEventViewController @synthesize backgroundColor, nameField, dateField, datePicker, eventName,

这可能是个愚蠢的问题,但我似乎找不到答案

我使用一个日期选择器允许用户输入日期,它还将时间设置为当前时间(我使用[NSDate date]初始化选择器)

有没有办法更改日期的时间成分?后来我计算了返回秒的时间间隔,由于时间的关系,我得到了一些奇怪的行为

此代码显示日期输入:

@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. 
两种选择:

备选案文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.
两种选择:

备选案文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.

非常好,谢谢。我确实必须将NSInterval更改为NSTimeInterval,但在那之后它就工作了。哦,对不起,我是说NSInteger。NSDATE组件(这是使用组件创建的:fromDate:toDate:options:将组件存储为NSInteger。实际上,现在我的代码看起来好多了,但我仍然有一个问题。下面是一个日志条目,解释了我的意思:从2009-11-19 21:06:40-0500到2009-11-18 21:14:56-0500是0天,我希望忽略时间和把这两个日期分开一天。有什么想法吗?对于这种情况,我能想到的最好的办法是,如果它现在不起作用,使用
组件:fromDate:
输入日期和当前日期进行比较,然后手动比较日期。非常好,谢谢。我确实必须将NSInterval更改为NSTimeInterval,但在那之后它就起作用了。哦,s哦,我是说NSInteger,NSDATE组件(这是使用组件创建的:fromDate:toDate:options:
将组件存储为NSInteger。实际上,现在我的代码看起来好多了,但我仍然有一个问题。下面是一个日志条目,解释了我的意思:从2009-11-19 21:06:40-0500到2009-11-18 21:14:56-0500是0天,我希望忽略时间和把这两个日期分开一天。有什么想法吗?对于这种情况,我能想到的最好的办法是,如果它现在不起作用,对
输入日期和当前日期都使用
组件:fromDate:
,然后手动比较日期。你应该将其更改为NSInteger,而不是将其更改为NSTimeInterval。我键入了d。谢谢,我看到了在我回答下面的问题后。你应该将其更改为NSInteger,而不是将其更改为NSTimeInterval。我输入了d。谢谢,我在回答下面的问题后看到了这一点。要确保你进行测试的一件事是,如果两个日期位于夏令时边界的两侧,它是否仍然返回相同的值。我已经在几个月内处理了这个问题场合。确保测试的一件事是,如果两个日期位于夏令时边界的两侧,它是否仍然返回相同的值。我已经多次处理过这个问题。