Melchior

バンクーバーで働くエンジニアの備忘録

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書きたいです。

ソース