Objective c 如何获取可可豆的当前日期
我正在开始为iPhone开发,因此我在网上看了不同的教程,也尝试了一些不同的东西。目前,我正在尝试创建一个到午夜的倒计时。要获得小时、分钟和秒数,我执行以下操作(我在某处找到): 但是,我使用Objective c 如何获取可可豆的当前日期,objective-c,cocoa,nsdate,Objective C,Cocoa,Nsdate,我正在开始为iPhone开发,因此我在网上看了不同的教程,也尝试了一些不同的东西。目前,我正在尝试创建一个到午夜的倒计时。要获得小时、分钟和秒数,我执行以下操作(我在某处找到): 但是,我使用-dateWithCalendarFormat:timeZone:的每个地方都会出现以下错误: warning: 'NSDate' may not respond to '-dateWithCalendarFormat:timeZone:' (Messages without a matching meth
-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
之后或变量NSDate*now
之前。两者的区别是什么?为什么要使用其中一个 星号的位置没有差异(在C中,Obj-C是基于C的,这无关紧要)。这纯粹是首选项(样式)。您必须使用以下选项:
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 *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:now];
NSLog(@"%d", [components hour]);
NSDate*now和NSDate*现在没有区别,只是偏好的问题。从编译器的角度来看,没有任何变化。
NSDate*now
和NSDate*now
是同一件事:指向NSDate对象的指针
您可能希望使用description with calendarFormat:timeZone:locale:,而不是dateWithCalendarFormat:-后者返回一个NSCalendarDate,文档称该日期计划在某个时候被弃用。您需要按照以下步骤执行操作:
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 *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:now];
NSLog(@"%d", [components hour]);
等等。还有另一种方法:
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将失去亚秒精度,但这并不重要 您还可以使用:
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
我认为这有以下好处:
*
)位于时间NSDate*now
之后或变量NSDate*now
之前。两者的区别是什么?为什么要使用其中一个
编译器并不在意,但在空格前加星号可能会产生误导。下面是我的例子:
int* a, b;
b
的类型是什么
如果你猜的是int*
,那你就错了。只是int
另一种方法是将*保留在它所属的变量旁边,从而使这一点稍微清楚一些:
int *a, b;
当然,还有两种方式比这更清楚:
int b, *a;
int *a;
int b;
我花了一段时间才找到为什么示例应用程序有效,而我的应用程序无效 作者提到的库(Foundation.Framework)是系统库(来自操作系统),其中不再支持iphone sdk(我使用的是3.0) 因此,示例应用程序(来自about.com)可以正常工作,但我们的无法正常工作。替换此:
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];
马克是对的,这段代码可以更有效地管理日期、小时、分钟和秒。但是他忘记了格式字符串声明开头的@。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原始海报-在夏令时开始或结束的日子里,你确定午夜前秒数的方法是行不通的。下面是一段代码,展示了如何做到这一点。。。它将以秒为单位(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);
return 3:33 AM//您可以使用以下代码获取当前日期/时间:
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];
为什么必须使用NSCalendar?这是最近的变化吗?有很多代码使用NSDate来实现这些功能。杰森:NSDate仍然存在。您正在使用NSCalendarDate(即-dateWithCalendarFormat:timeZone:returns),这是一种不推荐使用的方法,在iPhone上不存在。再看一看,iPhone SDK可能没有-(NSDate)dateWithNaturalLanguageString:(NSString*)str方法,因此这可能只是Leopard/Tiger的解决方案。很抱歉,这是一个很好的参数:始终将*附加到变量名;或者永远不要在同一行声明两个变量。就个人而言,由于我更倾向于将“指针”作为类型的一部分,所以我选择了后者,但是人们应该明确地知道这个问题。你真的不能没有它。缺少的是NcalendarDate,这在iPhone上从来没有出现过(据我所知)。在使用时,不要忘记第三个2前面的0。否则,少于10秒将显示为(例如)“:6”。
fromDate:now
对我不起作用。标识符现在没有定义或其他什么。如何使用当前日期初始化它?啊,[NSDate initwithtimeintervalsince:0]
似乎就是这样。实际上,[NSDate init]
将使用当前时间创建一个。如果您忘记在stringWithFormat上添加“@”。无论如何,感谢您的帮助。您必须释放从CFTimeZoneCopySystem()返回的引用,否则会出现内存泄漏。实际上YY
将以2位数字输出年份<代码>YYYY
将以4位数字输出年份。
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];