web-dev-qa-db-ja.com

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の直前にあることに気付きました。 2つの違いは何ですか?なぜ一方を使用するのですか?

58
Jason

以下を使用する必要があります。

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の間に違いはありません。それは単に好みの問題です。コンパイラの観点からは、何も変わりません。

48
Massimo Cafaro

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

58
Hover

以下も使用できます。


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. もっと早く。
21
Mark

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

    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];
12
Hemant Sharma

これを置き換えます:

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];
5
Adam D

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

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

int* a, b;

bのタイプは何ですか?

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

もう1つの方法は、*が属する変数の隣に*を保持することにより、これをわずかに明確にします。

int *a, b;

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

int b, *a;

int *a;
int b;
4
Peter Hosey

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

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

等々。

3
Gregory Higley

別の方法を次に示します。

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秒未満の精度が失われますが、それは問題ではありません。

1
Jeff Hellman

NSDate* nowおよびNSDate *nowは同じものです。NSDateオブジェクトへのポインターです。

おそらくdateWithCalendarFormat:ではなくdescriptionWithCalendarFormat:timeZone:locale:を使用したいでしょう—後者はNSCalendarDateを返します。

1
John

オリジナルのポスター-サマータイムが開始または終了する日の深夜までの秒数を決定する方法が機能しません。これを行う方法を示すコードの塊を以下に示します...秒数(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);
1
James Boutcher

アスタリスクの位置に違いはありません(Obj-Cの基になっているCでは、重要ではありません)。純粋に好み(スタイル)です。

0
chrish
+ (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

0
TONy.W

サンプルアプリケーションが動作するのになぜ動作しないのかを見つけるのに時間がかかりました。

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

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

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

マークは正解でした。このコードは、日付、時間、分、秒を管理するのに非常に効率的です。しかし、彼はフォーマット文字列宣言の最初の@を忘れていました。

0
Franakin