我如何获得cocoa的当前date

我开始为iPhone开发,因此我在网上查看不同的教程,以及尝试一些不同的东西。 目前,我正在尝试创造一个倒计时,直到午夜。 要获得小时,分钟和秒数,我做了以下(我发现的地方):

NSDate* now = [NSDate date]; int hour = 23 - [[now dateWithCalendarFormat:nil timeZone:nil] hourOfDay]; int min = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] minuteOfHour]; int sec = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] secondOfMinute]; countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, min,sec]; 

但是,我使用的每个地方-dateWithCalendarFormat:timeZone:我得到以下错误:

 warning: 'NSDate' may not respond to '-dateWithCalendarFormat:timeZone:' (Messages without a matching method signature will be assumed to return 'id' and accept '...' as arguments.) warning: no '-hourOfDay' method found error: invalid operands to binary - (have 'int' and 'id') 

这看起来很简单。 我错过了什么?

另外,我注意到在不同的地方,在不同的时间,星号(*)现在位于NSDate* now之后,或者在variablesNSDate *now之前。 两者有什么区别,为什么要用一个和另一个?

您必须使用以下内容:

 NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *dateComponents = [gregorian components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:yourDateHere]; NSInteger hour = [dateComponents hour]; NSInteger minute = [dateComponents minute]; NSInteger second = [dateComponents second]; [gregorian release]; 

NSDate *现在和NSDate *现在没有区别,这只是一个偏好问题。 从编译器的angular度来看,没有任何改变

你有问题的iOS 4.2? 使用此代码:

 NSDate *currDate = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; [dateFormatter setDateFormat:@"dd.MM.YY HH:mm:ss"]; NSString *dateString = [dateFormatter stringFromDate:currDate]; NSLog(@"%@",dateString); 

– > 20.01.2011 10:36:02

你也可以使用:

 CFGregorianDate currentDate = CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeGetCurrent(), CFTimeZoneCopySystem()); countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02.0f", currentDate.hour, currentDate.minute, currentDate.second]; CFRelease(currentDate); // Don't forget this! VERY important 

我认为这有以下好处:

  1. 没有直接的内存分配。
  2. 秒是一个整数,而不是一个整数。
  3. 没有消息呼叫。
  4. 更快。

//您可以使用以下代码获取当前date/时间:

  NSDate* date = [NSDate date]; NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; NSTimeZone *destinationTimeZone = [NSTimeZone systemTimeZone]; formatter.timeZone = destinationTimeZone; [formatter setDateStyle:NSDateFormatterLongStyle]; [formatter setDateFormat:@"MM/dd/yyyy hh:mma"]; NSString* dateString = [formatter stringFromDate:date]; 

replace这个:

 NSDate* now = [NSDate date]; int hour = 23 - [[now dateWithCalendarFormat:nil timeZone:nil] hourOfDay]; int min = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] minuteOfHour]; int sec = 59 - [[now dateWithCalendarFormat:nil timeZone:nil] secondOfMinute]; countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, min,sec]; 

有了这个:

 NSDate* now = [NSDate date]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *dateComponents = [gregorian components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:now]; NSInteger hour = [dateComponents hour]; NSInteger minute = [dateComponents minute]; NSInteger second = [dateComponents second]; [gregorian release]; countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, minute, second]; 

另外,我注意到在不同的地方,在不同的时间,星号( * )现在位于NSDate* now之后,或者在variablesNSDate *now之前。 两者有什么区别,为什么要用一个和另一个?

编译器不在乎,但在星号之前加上星号可能会引起误解。 这是我的例子:

 int* a, b; 

b的types是什么?

如果你猜int * ,你错了。 这只是int

另一种方法通过将*所在的variables旁边的*保留为更清楚一些:

 int *a, b; 

当然,有两种方式比这更清晰:

 int b, *a; int *a; int b; 

你需要按照以下方法做一些事情:

 NSDate *now = [NSDate date]; NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:now]; NSLog(@"%d", [components hour]); 

等等。

NSDate* nowNSDate *now是一样的东西:指向NSDate对象的指针。

你可能想要使用descriptionWithCalendarFormat:timeZone:locale:而不是dateWithCalendarFormat: – 后者返回一个NSCalendarDate,这个文档说在某个时间点将被弃用。

这是另一种方式:

 NSDate *now = [NSDate date]; //maybe not 100% approved, but it works in English. You could localize if necessary NSDate *midnight = [NSDate dateWithNaturalLanguageString:@"midnight tomorrow"]; //num of seconds between mid and now NSTimeInterval timeInt = [midnight timeIntervalSinceDate:now]; int hours = (int) timeInt/3600; int minutes = ((int) timeInt % 3600) / 60; int seconds = (int) timeInt % 60; 

将NSTimeInterval强制转换为int值时,您将失去亚秒级的精度,但这并不重要。

原始海报 – 在夏令时开始或结束的日子,您决定数秒至午夜的方式将无法使用。 下面是一段代码,它显示了如何做到这一点…它将以秒为单位(NSTimeInterval); 你可以做分裂/模数/等等,以满足你的需要。

 NSDateComponents *dc = [[NSCalendar currentCalendar] components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:[NSDate date]]; [dc setDay:dc.day + 1]; NSDate *midnightDate = [[NSCalendar currentCalendar] dateFromComponents:dc]; NSLog(@"Now: %@, Tonight Midnight: %@, Hours until midnight: %.1f", [NSDate date], midnightDate, [midnightDate timeIntervalSinceDate:[NSDate date]] / 60.0 / 60.0); 

星号的位置没有区别(在C中,Obj-C是基于它,没关系)。 这是纯粹的偏好(风格)。

我花了一段时间来找出为什么示例应用程序的工作,但我没有。

作者引用的库(Foundation.Framework)是不支持iphone sdk(我使用3.0)的系统库(来自OS)。

因此,示例应用程序(about.com, http://www.appsamuck.com/day1.html )的作品,但我们不。

 CFGregorianDate currentDate = CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeGetCurrent(), CFTimeZoneCopySystem()); countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%2.0f", currentDate.hour, currentDate.minute, currentDate.second]; 

马克是正确的这个代码是更有效地pipe理date时分秒。 但他在格式化string声明的开头忘了@。

 + (NSString *)displayCurrentTimeWithAMPM { NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; [outputFormatter setDateFormat:@"h:mm aa"]; NSString *dateTime = [NSString stringWithFormat:@"%@",[outputFormatter stringFromDate:[NSDate date]]]; return dateTime; } 

返回3:33 AM