Objective-CにおけるDate型の扱い
概要
なぜか最近仕事でObjective-Cを書いています。 サーバからmsのtimestampを受け取っているにも関わらず、時系列順に表示されなかったので調べてみました。
Types in Objective-C
まずはじめにハマったのが、msはint型には収まりません。JavaScriptの住人なのでここで時間をロスしました。
Types in objective-c on iPhone - Stack Overflow
この記事によると32bit端末ではlong型が4bytes扱い、64bit端末ではlong型が8bytes扱いだそうです。
Device一覧: https://en.wikipedia.org/wiki/List_of_iOS_devices
WikipediaによるとiPhone5S以降は64bitなので、long型を使うことにしました。(良いのかは不明)
Primitive sizes: The size of a char is: 1. The size of short is: 2. The size of int is: 4. The size of long is: 8. The size of long long is: 8. The size of a unsigned char is: 1. The size of unsigned short is: 2. The size of unsigned int is: 4. The size of unsigned long is: 8. The size of unsigned long long is: 8. The size of a float is: 4. The size of a double is 8. Ranges: CHAR_MIN: -128 CHAR_MAX: 127 SHRT_MIN: -32768 SHRT_MAX: 32767 INT_MIN: -2147483648 INT_MAX: 2147483647 LONG_MIN: -9223372036854775808 LONG_MAX: 9223372036854775807 ULONG_MAX: 18446744073709551615 LLONG_MIN: -9223372036854775808 LLONG_MAX: 9223372036854775807 ULLONG_MAX: 18446744073709551615
Dateの扱い
Objective-CではDateがmsをサポートしていないため、以下のように書かなければなりません。
NSNumber *timestamp = responseDict[@"timestamp"]; long ts = [timestamp doubleValue]; // coredataへ保存 NSDate *date = [NSDate dateWithTimeIntervalSince1970:ts/1000]; // ms -> s
JavaScriptの住人にとっては何だこれっていうレベルです。Swift知りませんが、きっとここらへんは改善されてるはず…祈
このプロジェクトではCoreDataにDate
型で保存していたため、secondまでしかサポートされておらず時系列順にソートすると残念な結果になったので、しれっとInteger 64
型に書き換えて保存するようにしました。
まとめ
せっかくならSwift書きたいです。