Objective c 如何获取可可豆的当前日期

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

我正在开始为iPhone开发,因此我在网上看了不同的教程,也尝试了一些不同的东西。目前,我正在尝试创建一个到午夜的倒计时。要获得小时、分钟和秒数,我执行以下操作(我在某处找到):

但是,我使用
-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];