Подтвердить что ты не робот

Как получить текущую дату в 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. В чем разница в двух и почему вы используете один против другого?

4b9b3361

Ответ 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

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

  1. Нет прямого распределения памяти.
  2. Секунды - это двойной, а не целое число.
  3. Нет вызовов сообщений.
  4. Быстрее.

Ответ 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 утра