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,508 views
2,325 views

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,508
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

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日土曜日

×