3

NSDateFormatter を使用して期間をフォーマットしています (こちらを参照)。

「3時間15分」のようなフォーマットを使いたいです。
私が使用しているフォーマット文字列は次のとおり@"H' hours, 'm' minutes'"です。

問題は、1 時間未満の期間の場合、結果が「0 時間 35 分」のようになることです。
そういう場合は単純に「35分」を表示したいだけです。

NSDateFormatter に時間をまったく表示しないように指示する方法はありますか?それとも if ステートメントを使用して手動で文字列を作成する必要がありますか?

編集:
これは、手動で数行追加するだけで簡単に実行できることをよく知っています。これは、過去に行った方法です。よくある問題のように思えるので、フォーマッターがこれを単独で処理するのに十分なスマートさを持っているかどうか疑問に思っています。

4

6 に答える 6

5

iOS 8.0 および Mac OS X 10.10 (Yosemite) 以降では、NSDateComponentsFormatter. allowedUnitsしたがって、 (あなたの例のように)時間と分NSDateComponentsFormatterZeroFormattingBehaviorDropLeadingを使用して、zeroFormattingBehaviorゼロ時間を削除します。例:

NSTimeInterval intervalWithHours = 11700; // 3:15:00
NSTimeInterval intervalWithZeroHours = 2100; // 0:35:00
NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
formatter.allowedUnits = NSCalendarUnitHour | NSCalendarUnitMinute;
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull;
formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDropLeading;
NSString *string = [formatter stringFromTimeInterval:intervalWithHours];
NSString *stringWithoutHours = [formatter stringFromTimeInterval:intervalWithZeroHours];
NSLog(@"%@ / %@", string, stringWithoutHours);
// output: 3 hours, 15 minutes / 35 minutes

スウィフト 5 バージョン:

let intervalWithHours: TimeInterval = 11700
let intervalWithZeroHours: TimeInterval = 2100
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute]
formatter.unitsStyle = .full
formatter.zeroFormattingBehavior = .dropLeading
if let string = formatter.string(from: intervalWithHours), let stringWithoutHours = formatter.string(from: intervalWithZeroHours) {
    print("\(string) / \(stringWithoutHours)")
    // output: "3 hours, 15 minutes / 35 minutes\n"
}
于 2015-01-21T16:13:55.407 に答える
2

日付文字列を取得したら (これをfooと呼びましょう)、stringByReplaceingOccurencesOfString:withString: を送信して別の文字列を作成します。例えば:

NSString* foo = @"0 hours, 35 minutes";
NSString* bar = [foo stringByReplacingOccurrencesOfString:@"0 hours, " withString:@"" options:0 range:NSMakeRange(0,9)];
NSLog(@"%@",bar);

出力は次のとおりです。

35 minutes

これが他の可能な方法と比較して非常に効率的であるとは思えませんが、何百もの文字列に対してそれを行う必要がない限り、おそらくそれほど重要ではありません.

編集: また、0 時間なしで日付を取得できるようにしたい場合は、stringFromDate: を使用していると仮定して、カテゴリを追加して次のようなメソッドを追加できます。

- (NSString *)stringFromDateWithoutZeroHours:(NSDate *)date{
    result = [self stringFromDate:date];
    return [result stringByReplacingOccurrencesOfString:@"0 hours, " withString:@"" options:0 range:NSMakeRange(0,9)];
}
于 2012-09-02T19:51:47.113 に答える
1

独自のNSDateFormatterサブクラスを作成し、stringFromDateこの1つのケースをオーバーライドしてみませんか?

于 2012-09-02T19:36:30.257 に答える
1

NSCalendar と NSDateComponents を使用してそれを行う 1 つの方法を次に示します。

static NSString *stringWithTimeInterval (NSTimeInterval interval)
{
    NSDate *referenceDate = [NSDate dateWithTimeIntervalSince1970:0];
    NSDate *intervalDate = [NSDate dateWithTimeIntervalSince1970:interval];

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [calendar components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:referenceDate toDate:intervalDate options:0];

    NSMutableArray *stringComponents = [NSMutableArray array];

    NSInteger hours = [components hour];
    NSInteger minutes = [components minute];

    if (hours > 0) {
        [stringComponents addObject:[NSString stringWithFormat:@"%ld hours", hours]];
    }
    [stringComponents addObject:[NSString stringWithFormat:@"%ld minutes", minutes]];

    return [stringComponents componentsJoinedByString:@" "];
}
于 2012-09-02T19:52:02.137 に答える