8

Unicode日付フォーマットパターンガイド(ここ)には、フォーマットに「a」を追加するとピリオド(たとえば、AMまたはPM)が取得されると記載されています。

[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss a"];

ただし、期間情報が表示されないようにしたいのですが、そのためのフォーマット文字列が見つかりません。私が使用しているフォーマット文字列は次のとおりです。

[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];

残念ながら、stringFromDateを使用すると、次のようになります。

2013-01-09T11:11:00 AM

カレンダーなどによって期間の構文が異なる可能性があるため、結果の文字列からAMまたはPMを単純に削除したくはありません。期間情報の表示を停止したいだけです。

---- 8 <------

次のコードを検討してください

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
NSString *stringDate = [formatter stringFromDate:[NSDate date]];

self.labelOutput.text = stringDate;

[formatter release];

このコードは、必要な形式の文字列を生成しますが、メモリ管理上の理由から使用できません。私が取り組んでいるアプリは、NSDateFormatterのメモリリークに悩まされています。そのため、シングルトンクラスを使用して、リリースされないセット数のNSDateFormattersをアプリに提供します。したがって、リークされるメモリの量を最小限に抑えます。残念ながら、これらの静的NSDateFormatterは、日付形式の文字列を適用した場合でも、AM/PMを追加しています。

NSDateFormatter *formatter = [MyDateFormatter dateFormat:kFormatDateMediumStyleTimeShortStyle];

[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
4

5 に答える 5

6

同じiOSバージョンを実行しているさまざまなデバイスでの日付フォーマッターのさまざまな出力に応じて、のローカルを設定すると、これが修正さNSDateFormatterれます。en_US_POSIX

ローカルを設定することに加えて、次のようにタイムゾーンを設定する際の問題を回避したい場合があります。
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@ "UTC"]];

于 2013-04-11T19:38:10.557 に答える
2

実際にはユーザーの設定によって異なります。

データフォーマットガイドの固定フォーマットの部分を参照してください。この文に注意してください:

iOSでは、ユーザーはデフォルトのAM/PMと24時間制の設定を上書きできます。これにより、NSDateFormatterが設定したフォーマット文字列を書き換える可能性があります。

そして段落の終わりに:

時間の表現は13:00かもしれません。ただし、iOSでは、ユーザーが24時間制をオフに切り替えた場合、時刻は午後1時になる可能性があります。

于 2013-01-09T11:33:24.610 に答える
1

ここでサンプルコードのPOSIXを使用する必要があります

  NSDateFormatter *rfc3339DateFormatter = [[NSDateFormatter alloc] init];
      NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

      [rfc3339DateFormatter setLocale:enUSPOSIXLocale];
      [rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
      [rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

      // Convert the RFC 3339 date time string to an NSDate.
      NSDate *date = [rfc3339DateFormatter dateFromString:rfc3339DateTimeString];
于 2014-06-24T12:45:48.037 に答える
0

1つのオプションは、独自のNSFormatterを作成することです。XcodeのInterfaceBuilderでフォーマッターを取得できなかったときに、コードでこれを実行しました。確かに、私は時間、分、秒だけを探していて、完全な日付は探していませんでした。

メモリリークについては、可能であればARCを使用してください。できない場合は、XcodeのStatic Analyzerを使用して、不適切な保持カウントを追跡してみてください。

于 2013-01-17T21:32:26.547 に答える
0

これが私が決めた答えです。それは少し単純ですが、それは仕事をします。

@interface NSDateFormatter (Utils)

- (NSString *)stringWithNoPeriodInformationFromDate:(NSDate*)date;

@end

@implementation NSDateFormatter (Utils)

- (NSString *)stringWithNoPeriodInformationFromDate:(NSDate*)date
{
    NSString *stringWithPotentialPeriodInformation = [self stringFromDate:date];
    NSString *stringWithNoAMInformation = [stringWithPotentialPeriodInformation stringByReplacingOccurrencesOfString:[self AMSymbol] withString:@""];
    NSString *stringWithNoPeriodInformation = [stringWithNoAMInformation stringByReplacingOccurrencesOfString:[self PMSymbol] withString:@""];

    return stringWithNoPeriodInformation;
}

@end
于 2013-01-25T13:18:04.410 に答える