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.
两个选项:
选项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,它的工作非常好,谢谢! – Eric 2009-11-19 22:56:58
确保你测试的一件事是,如果两个日期位于日光savi的两侧时间边界,它是否仍然返回相同的值。我不得不多次处理这个问题。 – 2009-11-22 18:23:46
NSInteger days = [[[NSCalendar currentCalendar] components:NSDayCalendarUnit
fromDate:enteredDate
toDate:[NSDate date]
options:0] day];
非常好,谢谢。我确实必须将NSInterval更改为NSTimeInterval,但在此之后才起作用。 – Eric 2009-11-19 01:25:04
哎呀,对不起,我的意思是NSInteger。 NSDateComponents(这是什么使用'组件创建:FROM日期:TODATE:选项:'店组件NSIntegers – jtbandes 2009-11-19 01:43:19
其实现在我的代码看起来好多了,但我仍然有一个问题,这就是解释了什么我的意思是日志条目: 从2009-11-19 21:06:40 -0500至2009-11-18 21:14:56 -0500是0天 我希望忽略时间并考虑相隔一天任何想法? – Eric 2009-11-19 02:19:03
你应该改变,要NSInteger的,而不是将其更改为NSTimeInterval的。我打错了。 – jtbandes 2009-11-19 01:43:53
谢谢,我在下面回复后看到了。 – Eric 2009-11-19 02:42:05