Как получить текущую дату в Cocoa
Я начинаю разрабатывать для 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
. В чем разница в двух и почему вы используете один против другого?
Ответы
Ответ 1
Вы должны использовать следующее:
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 *, это просто вопрос предпочтения. С точки зрения компилятора ничего не меняется.
Ответ 2
У вас проблемы с 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
Ответ 3
Вы также можете использовать:
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
Я думаю, что это имеет следующие преимущества:
- Нет прямого распределения памяти.
- Секунды - это двойной, а не целое число.
- Нет вызовов сообщений.
- Быстрее.
Ответ 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];
Ответ 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];
Ответ 6
Кроме того, я заметил в разных местах, и в разное время звездочка (*
) расположена либо сразу после времени NSDate* now
, либо прямо перед переменной NSDate *now
. В чем разница в двух и почему вы используете один против другого?
Компилятору все равно, но помещать звездочку до того, как пространство может ввести в заблуждение. Вот мой пример:
int* a, b;
Каков тип b
?
Если вы догадались int *
, вы ошибаетесь. Это просто int
.
Другой способ делает это немного яснее, сохраняя * рядом с переменной, к которой он принадлежит:
int *a, b;
Конечно, есть два способа, которые еще более ясны:
int b, *a;
int *a;
int b;
Ответ 7
Вам нужно сделать что-то в следующих строках:
NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:now];
NSLog(@"%d", [components hour]);
И так далее.
Ответ 8
NSDate* now
и NSDate *now
- одно и то же: указатель на объект NSDate.
Вероятно, вы захотите использовать descriptionWithCalendarFormat: timeZone: locale:, а не dateWithCalendarFormat: - последний возвращает NSCalendarDate, о котором, как сообщают, говорится, считается устаревшим на некоторых точка.
Ответ 9
Здесь другой способ:
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, но это не имеет значения.
Ответ 10
Оригинальный плакат - то, как вы определяете секунды до полуночи, не будет работать в тот день, когда начинается или заканчивается летнее время. Вот фрагмент кода, который показывает, как это сделать... Это будет в количестве секунд (NSTimeInterval); вы можете сделать подразделение/модуль/etc, чтобы перейти к тому, что вам нужно.
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);
Ответ 11
Нет разницы в местоположении звездочки (на C, на котором основан Obj-C, это не имеет значения). Это чисто предпочтение (стиль).
Ответ 12
Мне потребовалось некоторое время, чтобы найти, почему образец приложения работает, но у меня нет.
Библиотека (Foundation.Framework), на которую ссылается автор, представляет собой системную библиотеку (из ОС), где iphone sdk (я использую 3.0) больше не поддерживает.
Поэтому пример приложения (от about.com, http://www.appsamuck.com/day1.html) работает, но у нас этого нет.
Ответ 13
CFGregorianDate currentDate = CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeGetCurrent(), CFTimeZoneCopySystem());
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%2.0f", currentDate.hour, currentDate.minute, currentDate.second];
Марк был прав, этот код МНОГО более эффективен для управления датами часов min и secs. Но он забыл @в начале объявления строки формата.
Ответ 14
+ (NSString *)displayCurrentTimeWithAMPM
{
NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
[outputFormatter setDateFormat:@"h:mm aa"];
NSString *dateTime = [NSString stringWithFormat:@"%@",[outputFormatter stringFromDate:[NSDate date]]];
return dateTime;
}
возвращение 3:33 утра