web-dev-qa-db-ja.com

24時間制のNSDateFormatter

現在の日付/時刻から特定の将来の日付/時刻までカウントダウンするカウントダウンタイマーがあります。 1つの問題を除いて、それは素晴らしい働きをしています。 NSDateFormatterdateFromStringを使用して将来の日付を入力します。 24時間クロックをサポートしていないことを示していますが、12を超える時間(時間)を受け入れることができないようです。 24時間時計のサポートまたは回避策を有効にする方法はありますか?これが私のコードの一部です:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"];
43
John

NSDateFormatterは 日付と時刻のパターンのUnicode標準 に従います。 24時間制の時間には「H」を使用します。

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"];
67
VoidPointer

同じ問題があり、HHの使用は一部のデバイスでのみ機能しました。Rogerも確認済みです。結局、これは私のために働いた解決策でした、私はそれが他のために働くことを望みます。この答えを見つけるのは困難でした。それを使用するフォーラムはなく、Appleのドキュメントに続く文字通り試行錯誤でした。

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

    [dateFormatter setLocale:enUSPOSIXLocale];

    NSString *dateFormat = @"dd/MM/yyyy HH:mm"; //MM for month, mm for minutes

    [dateFormatter setDateFormat:dateFormat];
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
    date = [dateFormatter dateFromString:string];
53
crojassoto

Swiftでの私のソリューション:

let formatter = NSDateFormatter()
var defIdentifer = formatter.locale.localeIdentifier
if !defIdentifer.hasSuffix("_POSIX") {
    defIdentifer = defIdentifer+"_POSIX"
    let locale = NSLocale(localeIdentifier: defIdentifer)
    formatter.locale = locale
}
formatter.dateFormat = "HH:mm"
11
EvGeniy Ilyin

NSDateFormattersの Apple Technical Q&A から取得

Q:NSDateFormatterを使用してインターネット形式の日付を解析していますが、一部の地域の一部のユーザーでは失敗します。特定の日付フォーマット文字列を設定しました。 NSDateFormatterがユーザーの地域設定とは無関係に動作するように強制するべきではありませんか?

A:いいえ。ほとんどのユーザーは日付形式の文字列を設定しても機能するように見えますが、この問題に対する適切な解決策ではありません。書式文字列が予期しない動作をする場所はたくさんあります。

これは私がSwiftで私のやり方をした方法です:

private let dateFormatter: NSDateFormatter = {
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
    dateFormatter.timeZone = NSTimeZone.init(forSecondsFromGMT: 0)
    return dateFormatter
}()
4
Harry Bloom

HHの代わりに最近同様の問題があり、NSDateFormatterhhを無視しましたa(AM/PMシンボル)とG(私のアプリで循環時代の名前)。

そして、デバイスのローカリゼーション設定に移動して、ランダムな選択をすると、すべてのフリークが消えてしまい、エラーを再び発生させることができないことを知って驚いた。とても変。

次に、シミュレーターでテストして、いくつかの調査を行いました。私の解決策があります:

NSDateFormatterを作成したら、現在のロケールを使用している場合でもロケールプロパティを明示的に設定します。より重要なのは、[NSLocale currentLocale]を使用しないでください。 、systemLocaleを使用するか、ロケール識別子を使用してNSLocaleインスタンスを明示的に作成します。

3
Chris

ロケールを変更せずにタイムゾーンを設定せずに、ユーザーがiPhoneで12時間形式を設定したときに24時間の文字列からNSDateを取得する目的のCバージョン:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSString *localeId = dateFormatter.locale.localeIdentifier;
if (! [localeId hasSuffix:@"_POSIX"]) {
    localeId = [localeId stringByAppendingString:@"_POSIX"];
    dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:localeId];
}
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH.mm.ss";

NSDate *date  = [dateFormatter dateFromString:dateText];
1
Denis Kutlubaev