我如何获得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
我认为这有以下好处:
- 没有直接的内存分配。
- 秒是一个整数,而不是一个整数。
- 没有消息呼叫。
- 更快。
//您可以使用以下代码获取当前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* now
和NSDate *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