Question

Je suis en train commencé à développer pour l'iPhone et en tant que tel que je suis à la recherche à différents tutoriels en ligne, ainsi que d'essayer des choses différentes sur moi-même. À l'heure actuelle, je suis en train de créer un compte à rebours jusqu'à minuit. Pour obtenir le nombre d'heures, minutes et secondes, je fais ce qui suit (que je trouve quelque part):

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];

Cependant, chaque endroit où je l'utilise je reçois l'-dateWithCalendarFormat:timeZone: erreur suivant:

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')

Cela semble être quelque chose de très simple. Qu'est-ce que je manque?

De plus, je l'ai remarqué à différents endroits et à différents moments de l'astérisque (*) est situé soit juste après le temps ou juste avant NSDate* now la variable NSDate *now. Quelle est la différence entre les deux et pourquoi vous utilisez l'un par rapport à l'autre?

Était-ce utile?

La solution

Vous devez utiliser ce qui suit:

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];

Il n'y a pas de différence entre NSDate * maintenant et NSDate * maintenant, il est juste une question de préférence. Du point de vue du compilateur, rien ne change.

Autres conseils

Vous avez des problèmes avec iOS 4.2? Utilisez ce code:

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

Vous pouvez également utiliser:


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

Je pense que cela présente les avantages suivants:

  1. Pas d'allocation de mémoire directe.
  2. secondes est une double au lieu d'un nombre entier.
  3. Aucun message appelle.
  4. Plus rapide.

// vous pouvez obtenir la date / heure avec le code suivant:

    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];

Remplacer ceci:

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];

Avec ceci:

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];
  

De plus, je l'ai remarqué à différents endroits et à différents moments de l'astérisque (*) est situé soit juste après le temps ou juste avant NSDate* now la variable NSDate *now. Quelle est la différence entre les deux et pourquoi voudriez-vous utiliser un par rapport à l'autre?

Le compilateur ne se soucie pas, mais mettre l'astérisque avant que l'espace peut être trompeur. Voici mon exemple:

int* a, b;

Quel est le type de b?

Si vous l'aurez deviné int *, vous avez tort. Il est juste int.

L'autre façon plus claire rend ce un peu en gardant le * à côté de la variable, il appartient à:

int *a, b;

Bien sûr, il y a deux façons qui sont encore plus clairs que:

int b, *a;

int *a;
int b;

Vous devez faire quelque chose le long des lignes de ce qui suit:

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

Et ainsi de suite.

Voici une autre façon:

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;

Vous perdez une précision plus fine avec les acteurs de la NSTimeInterval à un int, mais cela ne devrait pas d'importance.

NSDate* now et sont la même NSDate *now chose:. Un pointeur vers un objet NSDate

Vous voulez probablement utiliser descriptionWithCalendarFormat: timeZone: locale: plutôt que dateWithCalendarFormat: - ce dernier renvoie un NSCalendarDate, que les documents disent devrait être dépréciée à un Point.

Affiche originale - la façon dont vous déterminer secondes jusqu'à minuit ne fonctionnera pas un jour où l'heure d'été commence ou se termine. Voici un morceau de code qui montre comment le faire ... Ce sera en nombre de secondes (NSTimeInterval); vous pouvez faire la division / module / etc pour descendre à tout ce dont vous avez besoin.

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);

Il n'y a pas de différence dans l'emplacement de l'astérisque (à en C, qui est basée sur, peu importe Obj-C). Il est purement préférence (style).

Il m'a fallu un certain temps pour trouver pourquoi les travaux d'application de l'échantillon mais le mien ne le font pas.

La bibliothèque (Foundation.Framework) que l'auteur se réfère à la bibliothèque est de système (OS) où le sdk iphone (J'utilise 3.0) ne supporte plus.

Par conséquent, l'application de l'échantillon (de about.com, http://www.appsamuck.com/day1 .html ) fonctionne, mais nous ne le font pas.

CFGregorianDate currentDate = CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeGetCurrent(), CFTimeZoneCopySystem());
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%2.0f", currentDate.hour, currentDate.minute, currentDate.second];

Mark était juste ce code est beaucoup plus efficace pour gérer les dates et heures min sec. Mais il a oublié le @ au début de la déclaration de chaîne de format.

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

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

    return dateTime;
}

retour 03h33

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top