6

データベースからUNIXタイムスタンプを取得し、それから人間が読める形式の日付を作成しようとしています。私はこのように使用しています

long t1=[time longLongValue];

NSDate* date=[NSDate dateWithTimeIntervalSince1970:t1];

ここで、timeはタイムスタンプです。日付を印刷すると、

1956-02-18 19:04:01 +0000 

それ以外の

2013-01-02 12:31:03 +0000

タイムスタンプは1356765933449

4

4 に答える 4

7

ボリスが彼の答えで正しく指摘したように、それは整数のオーバーフローの問題です。

あなたのオブジェクトが何であるかはわかりませんtimeが、代わりにをsigned long int使用してNSTimeIntervalください。

iOSNSTimeIntervalでは現在次のように定義されています

typedef double NSTimeInterval;

しかし、あなたはそれについてあまり気にするべきではありません。型の同義語に固執することで、Appleが基礎となる定義を別のものに変更することを決定した場合に備えて保護されます。

つまり、コードを次のようなものに変更する必要があります

NSTimeInterval epoch = [time doubleValue];
NSDate * date = [NSDate dateWithTimeIntervalSince1970:epoch];

前に説明したコードの保守性の問題に関して、ここでは明示的にdoubleValue(多くのオプションはありません)を使用していますが、AppleがNSTimeInterval定義を割り当てと互換性のないものに変更した場合double、コンパイラーが通知するのは良いことです。

于 2013-01-02T12:29:09.597 に答える
6

Unix タイムスタンプには 32 ビットしかありません。

これらは signed int を使用するため、1.1.1970 からの秒数をカウントします。32 ビットの signed int は、2147483647 までの値しか保持できません1356765933449。これによりオーバーフローが発生し、日付が無効になります。

Year 2038 Problem2147483647 (最大値) は 2038 年 1 月 19 日火曜日の 03:14:07 UTC にヒットするため、これは とも呼ばれます。

于 2013-01-02T12:13:02.017 に答える
6

これを試して

- (NSString *) getDateFromUnixFormat:(NSString *)unixFormat
{

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:[unixFormat intValue]];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
    [dateFormatter setDateFormat:@"MMM dd, yyyy-h:mm"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    //NSDate *date = [dateFormatter dateFromString:publicationDate];
    NSString *dte=[dateFormatter stringFromDate:date];

    [dateFormatter release];
    return dte;

}
于 2013-01-02T11:43:35.733 に答える
0

次に、nsdateformatter を使用して日付をフォーマットします。詳細案内。

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html

于 2013-01-02T11:42:42.503 に答える