44

現在の日付/時刻から特定の将来の日付/時刻までカウントダウンするカウントダウンタイマーがあります。1つの問題を除いて、うまく機能しています。NSDateFormatterと を使って未来の日付を入力しますdateFromString。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"];
4

6 に答える 6

67

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"];
于 2010-01-25T20:26:44.480 に答える
57

私は同じ問題を抱えていて、Roger も検証したように、HH の使用は一部のデバイスでしか機能しませんでした。結局、これは私にとってはうまくいった解決策でした。他の人にもうまくいくことを願っています。この答えを見つけるのは困難でした。それに関するフォーラムはありませんでした。アップルのドキュメントに従って文字通り試行錯誤を繰り返しました。

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];
于 2013-12-26T23:07:27.650 に答える
12

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"
于 2016-06-03T10:00:52.803 に答える
4

HH最近、アプリで、NSDateFormatter無視hha(AM/PM 記号) およびG(周期的な元号)の代わりに、同様の問題が発生しました。

そして、デバイスのローカリゼーション設定に行ってランダムな選択をすると、すべてのフリークがなくなり、エラーが再び発生しないことに驚きました。とても奇妙です。

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

を作成した後、現在のロケールを使用している場合NSDateFormatterでもロケール プロパティを明示的に設定します。さらに重要なことは[NSLocale currentLocale]、使用しsystemLocaleないでください。 NSLocale.

于 2015-12-21T10:56:43.727 に答える
4

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
}()
于 2016-11-15T12:50:16.753 に答える