NSDate - 更改时间组件

问题描述:

这可能是一个愚蠢的问题,但我似乎无法找到答案。NSDate - 更改时间组件

我使用日期选择器,以允许用户输入一个日期,它也被设置时间到当前时间(I初始化与所述选择器[的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. 
+0

你应该改变,要NSInteger的,而不是将其更改为NSTimeInterval的。我打错了。 – jtbandes 2009-11-19 01:43:53

+0

谢谢,我在下面回复后看到了。 – Eric 2009-11-19 02:42:05

两个选项:

选项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. 
+0

我使用了选项2,它的工作非常好,谢谢! – Eric 2009-11-19 22:56:58

+0

确保你测试的一件事是,如果两个日期位于日光savi的两侧时间边界,它是否仍然返回相同的值。我不得不多次处理这个问题。 – 2009-11-22 18:23:46

NSInteger days = [[[NSCalendar currentCalendar] components:NSDayCalendarUnit 
                fromDate:enteredDate 
                toDate:[NSDate date] 
                options:0] day]; 
+0

非常好,谢谢。我确实必须将NSInterval更改为NSTimeInterval,但在此之后才起作用。 – Eric 2009-11-19 01:25:04

+0

哎呀,对不起,我的意思是NSInteger。 NSDateComponents(这是什么使用'组件创建:FROM日期:TODATE:选项:'店组件NSIntegers – jtbandes 2009-11-19 01:43:19

+0

其实现在我的代码看起来好多了,但我仍然有一个问题,这就是解释了什么我的意思是日志条目: 从2009-11-19 21:06:40 -0500至2009-11-18 21:14:56 -0500是0天 我希望忽略时间并考虑相隔一天任何想法? – Eric 2009-11-19 02:19:03