Вопрос по objective-c, cocoa – Как мне узнать текущую дату в Какао?

58

Я начинаю разрабатывать для 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 или прямо перед переменнойNSDate *now, В чем разница между двумя и почему вы используете один против другого?

Ваш Ответ

14   ответов
0

на котором основан Obj-C, это не имеет значения). Это чисто предпочтение (стиль).

0
+ (NSString *)displayCurrentTimeWithAMPM 
{
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setDateFormat:@"h:mm aa"];

    NSString *dateTime = [NSString stringWithFormat:@"%@",[outputFormatter stringFromDate:[NSDate date]]];

    return dateTime;
}

58

Используйте этот код:

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

Error: User Rate Limit ExceededYYError: User Rate Limit ExceededYYYYError: User Rate Limit Exceeded
0
CFGregorianDate currentDate = CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeGetCurrent(), CFTimeZoneCopySystem());
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%2.0f", currentDate.hour, currentDate.minute, currentDate.second];

этот код НАМНОГО более эффективен для управления датами часов, минут и секунд. Но он забыл @ в начале объявления форматной строки.

Error: User Rate Limit Exceeded
1

NSDate* now а такжеNSDate *now это то же самое: указатель на объект NSDate.

Вы, вероятно, хотите использоватьdescriptionWithCalendarFormat:timeZone:locale: скорее, чемdateWithCalendarFormat: & # X2014; последний возвращает NSCalendarDate, что, как утверждают документы, в какой-то момент считается устаревшим.

0

чтобы выяснить, почему пример приложения работает, а мое - нет.

Библиотека (Foundation.Framework), на которую ссылается автор, является системной библиотекой (из ОС), где iphone SDK (я использую 3.0) больше не поддерживается.

Поэтому образец приложения (от about.com,http://www.appsamuck.com/day1.html) работает, но у нас нет.

Error: User Rate Limit Exceeded
4

ve noticed at different places and at different times the asterisk (*) is located either right after the time NSDate* now or right before the variable NSDate *now. What is the difference in the two and why would you use one versus the other?

Компилятору все равно, но указание звездочки перед пробелом может вводить в заблуждение. Вот мой пример:

int* a, b;

Какой типb?

Если вы догадалисьint *вы не правы. Это простоint.

Другой способ делает это немного более понятным, оставляя * рядом с переменной, которой он принадлежит:

int *a, b;

Конечно, есть два способа, которые даже понятнее:

int b, *a;

int *a;
int b;
Error: User Rate Limit Exceeded
1

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, но это не имеет значения.

Error: User Rate Limit Exceeded
1

аботать в день, когда начинается или заканчивается переход на летнее время. Вот кусок кода, который показывает, как это сделать ... Это будет через несколько секунд (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);
5

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];
Error: User Rate Limit Exceeded[NSDate init]Error: User Rate Limit Exceeded
fromDate:nowError: User Rate Limit ExceedednowError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded[NSDate initWithTimeIntervalSinceNow:0]Error: User Rate Limit Exceeded
48

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 * сейчас, это просто вопрос предпочтений. С точки зрения компилятора ничего не меняется.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Jason
Error: User Rate Limit Exceeded
21


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

Я думаю, что это имеет следующие преимущества:

No direct memory allocation. Seconds is a double instead of an integer. No message calls. Faster.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
3

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

И так далее.

12

// вы можете получить текущую дату / время с помощью следующего кода:

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

Похожие вопросы