私は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
の直前にあることに気付きました。 2つの違いは何ですか?なぜ一方を使用するのですか?
以下を使用する必要があります。
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 * nowの間に違いはありません。それは単に好みの問題です。コンパイラの観点からは、何も変わりません。
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
以下も使用できます。
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* 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];
これを置き換えます:
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];
また、異なる場所で異なる時間にアスタリスク(
*
)がNSDate* now
の直後または変数NSDate *now
の直前にあることに気付きました。 2つの違いは何ですか?なぜ一方を使用するのですか?
コンパイラは気にしませんが、スペースの前にアスタリスクを付けると誤解を招く可能性があります。これが私の例です:
int* a, b;
b
のタイプは何ですか?
int *
を推測した場合、あなたは間違っています。ただint
です。
もう1つの方法は、*が属する変数の隣に*を保持することにより、これをわずかに明確にします。
int *a, b;
もちろん、それよりもさらに明確な2つの方法があります。
int b, *a;
int *a;
int b;
次の行に沿って何かをする必要があります。
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にキャストすると、1秒未満の精度が失われますが、それは問題ではありません。
NSDate* now
およびNSDate *now
は同じものです。NSDateオブジェクトへのポインターです。
おそらくdateWithCalendarFormat:ではなくdescriptionWithCalendarFormat:timeZone:locale:を使用したいでしょう—後者はNSCalendarDateを返します。
オリジナルのポスター-サマータイムが開始または終了する日の深夜までの秒数を決定する方法が機能しません。これを行う方法を示すコードの塊を以下に示します...秒数(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);
アスタリスクの位置に違いはありません(Obj-Cの基になっているCでは、重要ではありません)。純粋に好み(スタイル)です。
+ (NSString *)displayCurrentTimeWithAMPM
{
NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
[outputFormatter setDateFormat:@"h:mm aa"];
NSString *dateTime = [NSString stringWithFormat:@"%@",[outputFormatter stringFromDate:[NSDate date]]];
return dateTime;
}
リターン3:33 AM
サンプルアプリケーションが動作するのになぜ動作しないのかを見つけるのに時間がかかりました。
著者が参照するライブラリ(Foundation.Framework)は、iphone sdk(3.0を使用しています)がサポートしていないシステムライブラリ(OSから)です。
したがって、サンプルアプリケーション(about.comから http://www.appsamuck.com/day1.html )は機能しますが、機能しません。
CFGregorianDate currentDate = CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeGetCurrent(), CFTimeZoneCopySystem());
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%2.0f", currentDate.hour, currentDate.minute, currentDate.second];
マークは正解でした。このコードは、日付、時間、分、秒を管理するのに非常に効率的です。しかし、彼はフォーマット文字列宣言の最初の@を忘れていました。