60

私は 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また、さまざまな場所とさまざまな時間に、アスタリスク (*) が時間の直後または variable の直前にあることに気付きましたNSDate *now。この 2 つの違いは何ですか? また、どちらを使用するのですか?

4

14 に答える 14

59

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

于 2011-01-20T09:39:10.633 に答える
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*nowとNSDate*nowの間に違いはありません。これは、好みの問題です。コンパイラの観点からは、何も変わりません。

于 2009-07-01T17:37:10.823 に答える
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

これには次の利点があると思います。

  1. 直接メモリ割り当てはありません。
  2. 秒は整数ではなく倍精度浮動小数点数です。
  3. メッセージ呼び出しはありません。
  4. もっと早く。
于 2009-07-01T20:16:00.723 に答える
12

// 次のコードで現在の日付/時刻を取得できます。

    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];
于 2012-12-27T12:47:33.117 に答える
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];
于 2009-09-22T19:21:07.783 に答える
4

*また、さまざまな場所とさまざまな時間に、アスタリスク ( ) が時間のNSDate* now直後または変数の直前にあることに気付きましたNSDate *now。この 2 つの違いは何ですか? また、どちらを使用するのですか?

コンパイラは気にしませんが、スペースの前にアスタリスクを置くと誤解を招く可能性があります。これが私の例です:

int* a, b;

の型はb何ですか?

あなたが推測した場合int *、あなたは間違っています。それだけintです。

もう 1 つの方法では、所属する変数の横に * を付けておくことで、これを少し明確にします。

int *a, b;

もちろん、それよりもさらに明確な方法が 2 つあります。

int b, *a;

int *a;
int b;
于 2009-07-02T02:35:41.377 に答える
4

次の行に沿って何かを行う必要があります。

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

等々。

于 2009-07-01T17:45:58.613 に答える
1

NSDate* nowNSDate *now同じものです:NSDateオブジェクトへのポインタ。

dateWithCalendarFormat:ではなくdescriptionWithCalendarFormat:timeZone:locale:を使用することをお勧めします。後者はNSCalendarDateを返します。これは、ドキュメントによると、ある時点で非推奨になる予定です。

于 2009-07-01T17:39:25.733 に答える
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);
于 2011-09-07T11:40:32.870 に答える
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 にキャストすると、1 秒未満の精度が失われますが、それは問題ではありません。

于 2009-07-01T19:36:58.430 に答える
0

サンプルアプリケーションが機能する理由を見つけるのに少し時間がかかりましたが、私の場合は機能しません。

著者が参照しているライブラリ(Foundation.Framework)は、iphone sdk(私は3.0を使用しています)がサポートされなくなったシステムライブラリ(OSから)です。

したがって、サンプルアプリケーション(about.com、http://www.appsamuck.com/day1.htmlから)は機能しますが、私たちのアプリケーションは機能しません。

于 2009-08-15T14:05:02.483 に答える
0
+ (NSString *)displayCurrentTimeWithAMPM 
{
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setDateFormat:@"h:mm aa"];

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

    return dateTime;
}

午前3時33分に戻る

于 2012-12-17T19:32:40.567 に答える
0

アスタリスクの位置に違いはありません(Obj-Cが基づいているCで、それは問題ではありません)。それは純粋に好み(スタイル)です。

于 2009-07-01T17:32:45.057 に答える
0
CFGregorianDate currentDate = CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeGetCurrent(), CFTimeZoneCopySystem());
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%2.0f", currentDate.hour, currentDate.minute, currentDate.second];

マークは正しかったこのコードは、日付を時間分と秒で管理するのにはるかに効率的です。しかし、彼は書式文字列宣言の先頭にある @ を忘れていました。

于 2010-04-08T15:55:42.550 に答える