2016-06-24 2 views
0

ユーザーがログインして別のタイムゾーンにある可能性のあるサイトを選択できるアプリを開発中です。アプリはそのサイトに関連するデータを表示しているため、NSTimeZone.setDefaultTimeZone経由でサイトタイムゾーンに設定することがアプリのデフォルトのタイムゾーンに設定されています。これは、私がFMDB(私はそれと何か関係がないと思う)と 'localtime'でstrftimeを使用してsqlite dbからデータを選択する場合を除いて素晴らしいです。私たちのデータは、エポックを使用して分単位でUTCで保存されますが、現地の時間帯で曜日、曜日、月ごとに集計を表示する必要があります。例えば、平日で平均値を取得するには:アプリのデフォルトタイムゾーンが設定されていても、システムタイムゾーンを使用しているiOSの日付機能のSQLite

select strftime('%w',datetime(epoch,'localtime')),avg(value) 
    from values 
    where siteId = 'x' 
    group by 1 
    order by 2 desc 

それが使っていることを「localtimeのは、」システムの現地時間ではなく、すべてのNSDateコールはデフォルトのタイムゾーンを尊重アプリのデフォルトのタイムゾーンです。 localtimeとUTC以外のstrftimeの他のタイムゾーンオプションは存在しません。現在の回避策は、上記のように1つのクエリで簡単に処理できる複数のSQLラウンドトリップを必要とします。

iOS上のsqliteが 'localtime'をどのように決定するか教えてください。別のつまりdefaultTimeZoneを使用するように強制する方法はありますか?

答えて

0

ご覧のとおり、SQLiteはNSDateまたはそのアプリのローカルタイムゾーンを使用しません。 datetime関数は修飾子で変換します。あなたはGMTとして格納する(私はこれはあなたのアプリケーションのためのケースだと思います)DB持っていたと言う:この例(およびあなた)で

sqlite> create table mytable (id int, time datetime); 
sqlite> insert into mytable values (1, CURRENT_TIMESTAMP); 
sqlite> select time from mytable; 
2016-06-24 19:05:36 <- THIS IS GMT 
sqlite> select datetime(time, 'localtime') from mytable; 
2016-06-24 15:05:36 <- THIS IS LOCAL TIME 

「をlocaltimeのは」モディファイです。 sqliteのドキュメントから:

修飾子

時刻文字列が 日付および/または時刻を変更するゼロ個以上の修飾子を続けることができます。各修飾子は、左側の時間値 に適用される変換です。修飾子は左から右に適用されます。 注文が重要です。使用可能な修飾子は次のとおりです。

  1. NNN日
  2. NNNの時間
  3. NNN分
  4. NNN.NNNN秒
  5. NNNヶ
  6. NNN年月の
  7. 開始
  8. 年の
  9. 開始
  10. 開始日
  11. 平日N
  12. unixepoch
  13. localtimeの
  14. UTC

ですから、直接ローカル値に変換することはできません。あなたはこれらのmodifersを使用することができますので、しかし、あなたのアプリは、あなたの地元のGMTはNSDateからのオフセットを取得することができます。

if let myZone = NSTimeZone(abbreviation: "EST") 
{ 
    NSTimeZone.setDefaultTimeZone(myZone) 
    var offset = (myZone.secondsFromGMT)/3600 as Int 
    var offsetModifer = "\(offset) hours" 
} 

は、その後、あなたがようにあなたのsqliteのクエリを実行することができます(例では-4 hoursに変換offsetModiferを使用してクエリを構築しますここに:

sqlite> select datetime(time, '-4 hours') from mytable; 
2016-06-24 15:05:36 
+0

デビッド、そのよう十分に文書回答のおかげでそれはまだ、年間2日間は24時間ではないとオフセットこれらの境界を通過するときのために同じではありません夏時間の問題を解決していません!開始日と終了日。私はまだそれを処理する必要がありますNSDateから開始日と終了日を取得していますが、計算されたオフセットを使用することは、ほとんどの場合、最適な解決策となります。 – skymatt70

関連する問題