39

特定の形式で日付を出力しようとしています:

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];

iPhone が 24 時間制に設定されている場合、これは正常に機能します。一方、ユーザーが 24 時間制に設定されている場合は、AM/PM に戻ります (この設定を切り替えるまでは正常に機能します)。その後、AM が追加されます。求めていないのに最後に /PM:

20080927030337 PM

何か間違ったことをしているのですか、それともファームウェア 2.1 のバグですか?

編集1:説明をより明確にしました

編集 2 の回避策: これはバグであることが判明しました。修正するために、AM と PM の文字を "" に設定しました。

[dateFormatter setAMSymbol:@""];
[dateFormatter setPMSymbol:@""];
4

8 に答える 8

31

この動作の理由は Locale です。正しい Locale を設定します。

NSDateFormatterのローカルをen_US_POSIXに設定すると、これが修正されます。24 時間形式と 12 時間形式の両方で機能します。

On iPhone OS, the user can override the default AM/PM versus 24-hour time setting (via Settings > General > Date & Time > 24-Hour Time), which causes NSDateFormatter to rewrite the format string you set.アップルドキュメントより

これを試して、

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];
于 2013-11-08T11:26:18.780 に答える
14

これがiPhoneSDKのバグの説明です(3.1ベータSDKにもまだあります)

まず、iPhoneのユーザーインターフェイスの背景について説明します。iPhoneユーザーが地域の形式を「米国」と「フランス」などの間で変更すると、ユーザーの「24時間制」設定は、その地域で最も普及しているモードに自動的に切り替えられます。フランスでは、24時間制が「オン」に設定され、米国では、「オフ」に設定されます。その後、ユーザーはその設定を手動でオーバーライドでき、そこから問題が発生します。

この問題は、ユーザーが手動で選択した12時間または24時間モードでNSDateFormatterが何らかの形で「スタック」することに起因します。したがって、フランスのユーザーが手動で12時間モードを選択し、アプリケーションがNSDateFormatterに24時間形式の「HHmm」で時刻を出力するように要求した場合、実際には「01:00PM」などの12時間形式で時刻を受信します。アプリケーションが代わりに「hhmmaa」を要求したかのように。米国のユーザーが手動で24時間モードを選択した場合は、逆になります。12時間形式の「hhmmaa」で時刻を出力すると、実際には「17:00」などの24時間形式で時刻が取得されます。

詳細と考えられる回避策は、このブログにあります。

于 2009-12-09T04:41:01.527 に答える
12

シミュレーターと、2.1 ファームウェアと 24 時間制の時刻がオフに設定された電話の両方に投稿したコードを使用すると、dateStr に AM/PM が追加されることはありませんでした。

NSLog(@"%@", dateStr);

ここに投稿していない dateStr で何か他のことをしていますか? どのように値を確認していますか?

ファローアップ

午前/午後の設定をオンにしてからオフにしてみてください。私がそれをするまで、私も問題を抱えていませんでした。私はあなたと同じようにそれを印刷しています。

わかりました、私もこれをするとわかります。バグに違いない。バグ レポートを提出し、その間に不要な文字をチェックして除外することをお勧めします。

于 2008-09-27T06:17:37.660 に答える
9

日付フォーマッタのロケールをen_USに設定すると、問題が修正されます。

    NSDateFormatter * f = [[NSDateFormatter alloc] init];
    [f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];

カレンダーの追加も必要かどうかはわかりませんが、これはうまくいきます。

于 2011-05-20T01:49:28.540 に答える
4

これが解決策だと思います。

NSDateFormatter *df =[[NSDateFormatter alloc] init];
        [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

[df setLocale: usLocale];

[usLocale release];

 NSDate *documento_en_Linea =[[[NSDate alloc] init]autorelease];

documento_en_Linea=[df dateFromString:@"2010-07-16 21:40:33"];

[df release];

        NSLog(@"fdocumentoenLineaUTC:%@!",documento_en_Linea);


//ouput  
     fdocumentoenLineaUTC:2010-07-16 09:40:33 p.m. -0500!
于 2010-07-16T21:43:56.367 に答える
1

この質問を見つけて、NSDateFormatter を使用して 24 時間の時刻を解析したいが、このバグに遭遇している場合は、NSDateComponents を使用して、既知の形式を持つ日付と時刻を解析することで、この問題を回避できます。

NSString *dateStr = @"2010-07-05";
NSString *timeStr = @"13:30";

NSDateComponents *components = [[NSDateComponents alloc] init];
components.year = [[dateStr substringToIndex:4] intValue];
components.month = [[dateStr substringWithRange:NSMakeRange(5, 2)] intValue];
components.day = [[dateStr substringFromIndex:8] intValue];
components.hour = [[timeStr substringToIndex:2] intValue];
components.minute = [[timeStr substringFromIndex:3] intValue];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *date = [calendar dateFromComponents:components];

[components release];
[calendar release];
于 2010-07-04T13:47:12.377 に答える
0

簡単な答え: [dateFormatter setDateFormat:@"yyyyMMddhhmmss"];12 時間形式を試してください (小文字に注意してくださいhh)。

非常に多くの Web サイトが何時間も使用することを示しているため (Apple の公式ドキュメントを含む)、イライラするトピックでしたが、 12 時間形式を使用してHHいるのに対し、24 時間形式に設定されています。hh詳細については、http: //unicode.org/reports/tr35/tr35-6.html#Date_Format_Patternsを参照してください。

KKおまけとして、時刻形式にorも使用できることに注意してくださいkk。これは 1 ずれている可能性があります。

更新: 最近 NSLocale (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/Reference/Reference.html) を見ていましたが、使用できるようですautoupdatingCurrentLocale を使用して、アプリ内で行われた変更をロケールに適用します。これの結果として、携帯電話が 24 時間時計を使用するように設定されていても (フランスに切り替えたときのように)、携帯電話の他のアプリに影響を与えずにアプリを 12/24 に切り替えることができます。または、変更を行うためにアプリを終了する必要があります。

于 2012-06-20T22:05:00.997 に答える
0

これも機能するはずです(ただし、奇妙な結果がいくつか見られます)。

-(NSString*)lowLevTime:(NSString*)stringFormat {
    char buffer[50];
    const char *format = [stringFormat UTF8String];
    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    strftime(buffer, sizeof(buffer), format, timeinfo);
    return [NSString  stringWithCString:buffer encoding:NSASCIIStringEncoding];
}
于 2010-09-12T01:48:15.917 に答える