Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
FMDBで日付を扱う場
合の注意点
13年7月20日土曜日
@gorou_178
Java屋だけどiPhoneアプリに興味
があり自作中。Web系の勉強会などに参加
13年7月20日土曜日
もくじ
• タイムゾーンとは
• SQLiteの日付の扱い方
• Objective-Cで日付取得
• 日付の保存/取得方法
• まとめ
13年7月20日土曜日
タイムゾーンとは
• 各国によって時差がある
(表示時刻が異なる)
• 世界基準はイギリスのロンドン
• イギリスと日本は9時間の時差
• GMTとかUTCと呼ばれる(日本はJST)
13年7月20日土曜日
タイムゾーンとは
• iPhoneでは「設定」
→「日付と時刻」の時
間帯で設定可能
• 自動設定をオフにする
と変更できる
13年7月20日土曜日
SQLiteの日付の扱い方
• データ型として日付型がない
• 文字列として扱われる
• そのためソートが辞書順になる
※ちゃんと日付順にならない
13年7月20日土曜日
SQLiteの日付の扱い方
• REAL型(浮動小数点)を利用
• 日付を小数で表現するjulianday関数を利
用
• 数値なので大小でのソートが可能
13年7月20日土曜日
SQLiteの日付の扱い方
• juliandayのinsert例
• create table todo(id integer, title text, createDate real);
• insert into todo values(...
SQLiteの日付の扱い方
• REAL値を日付に変換 - datetime関数利用
• select datetime(createDate) from todo;
→ 2013-07-01 10:00:00
  ※UTCとして表示される
•...
Objective-Cで日付取得
• [NSDate date]で現在時刻を取得
• 環境のタイムゾーンに関係なくGMTで
取得される
13年7月20日土曜日
Objective-Cで日付取得
• NSDateFormatでNSDate NSStringの変
換が可能
• ただしバグがあるので注意
13年7月20日土曜日
Objective-Cで日付取得
• バグの対処方法
• setLocaleでlocaleをセット
• setCalendarでグレゴリオ暦カレンダをセット
• setTimezoneでtimezoneをセット
• setFormatで大文字の...
日付の保存/取得方法
• UTC日付でSQLiteにREAL値でinsert
• NSDate *date = [NSDate date];
NSDateFormatter* formatter = [[NSDateFormatter allo...
日付の保存/取得方法
• select時にタイムゾーンの時刻に変換
• select id, title, datetime(createDate,“localtime”) cdate from todo;
• datetimeの結果は文字列
...
まとめ
• SQLiteの日付はREAL型を使う
• iOSの日付取得はバグに気をつける
• 登録はUTC、取得はシステムのロケー
ルやタイムゾーンに変換
13年7月20日土曜日
ありがとうございました
13年7月20日土曜日
Upcoming SlideShare
Loading in …5
×

Fmdbで日付を扱う場合の注意点

2,978 views

Published on

Published in: Technology
  • Be the first to comment

Fmdbで日付を扱う場合の注意点

  1. 1. FMDBで日付を扱う場 合の注意点 13年7月20日土曜日
  2. 2. @gorou_178 Java屋だけどiPhoneアプリに興味 があり自作中。Web系の勉強会などに参加 13年7月20日土曜日
  3. 3. もくじ • タイムゾーンとは • SQLiteの日付の扱い方 • Objective-Cで日付取得 • 日付の保存/取得方法 • まとめ 13年7月20日土曜日
  4. 4. タイムゾーンとは • 各国によって時差がある (表示時刻が異なる) • 世界基準はイギリスのロンドン • イギリスと日本は9時間の時差 • GMTとかUTCと呼ばれる(日本はJST) 13年7月20日土曜日
  5. 5. タイムゾーンとは • iPhoneでは「設定」 →「日付と時刻」の時 間帯で設定可能 • 自動設定をオフにする と変更できる 13年7月20日土曜日
  6. 6. SQLiteの日付の扱い方 • データ型として日付型がない • 文字列として扱われる • そのためソートが辞書順になる ※ちゃんと日付順にならない 13年7月20日土曜日
  7. 7. SQLiteの日付の扱い方 • REAL型(浮動小数点)を利用 • 日付を小数で表現するjulianday関数を利 用 • 数値なので大小でのソートが可能 13年7月20日土曜日
  8. 8. SQLiteの日付の扱い方 • juliandayのinsert例 • create table todo(id integer, title text, createDate real); • insert into todo values(1, "タスク", julianday("2013-07-01 10:00:00")); → select結果: 1|タスク|2456474.91666667 13年7月20日土曜日
  9. 9. SQLiteの日付の扱い方 • REAL値を日付に変換 - datetime関数利用 • select datetime(createDate) from todo; → 2013-07-01 10:00:00   ※UTCとして表示される • select datetime(createDate,‘localtime’) from todo; → 2013-07-01 19:00:00   ※実行環境のロケール(タイムゾーン)での日付が表示される 13年7月20日土曜日
  10. 10. Objective-Cで日付取得 • [NSDate date]で現在時刻を取得 • 環境のタイムゾーンに関係なくGMTで 取得される 13年7月20日土曜日
  11. 11. Objective-Cで日付取得 • NSDateFormatでNSDate NSStringの変 換が可能 • ただしバグがあるので注意 13年7月20日土曜日
  12. 12. Objective-Cで日付取得 • バグの対処方法 • setLocaleでlocaleをセット • setCalendarでグレゴリオ暦カレンダをセット • setTimezoneでtimezoneをセット • setFormatで大文字のYを使わない • 以下のブログを参考にしました • Technology-Gym | http://tech-gym.com/2012/10/ios/893.html 13年7月20日土曜日
  13. 13. 日付の保存/取得方法 • UTC日付でSQLiteにREAL値でinsert • NSDate *date = [NSDate date]; NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; [formatter setLocale:[NSLocale systemLocale]]; [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; [formatter setCalendar:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]]; [formatter setDateFormat:@”yyyy-MM-dd hh:mm:ss”]; NSString *strDate = [formatter stringFromDate:date]; • NSString *sql = [NSString alloc] initWithFormat:@”insert into todo values(1, ’タスク’, julianday(’%@’));”, strDate]; 13年7月20日土曜日
  14. 14. 日付の保存/取得方法 • select時にタイムゾーンの時刻に変換 • select id, title, datetime(createDate,“localtime”) cdate from todo; • datetimeの結果は文字列 • NSDateFormatterのstringToDateでNSDateに変換 ※この時もNSDateFormatterのバグに注意 13年7月20日土曜日
  15. 15. まとめ • SQLiteの日付はREAL型を使う • iOSの日付取得はバグに気をつける • 登録はUTC、取得はシステムのロケー ルやタイムゾーンに変換 13年7月20日土曜日
  16. 16. ありがとうございました 13年7月20日土曜日

×