SQLite の日付はUTC

 SQLite って何ってのは、とりあえずググって下さい。 本家はコチラ www.sqlite.org 。

どうやって落とすか、インストールするか、使うかってのも、色々リソースがあるので省略。
どうやってDataSetをデザインタイムでいじるのかってのも、コチラ http://sqlite.phxsoftware.com/ から。
で、本題。SQLite での日付型は、UTCで管理されるというオハナシ。
たとえば
CREATE TABLE test2(id int, name text, UpdateDate datetime);
なんてのがあって、
insert into test2 values(1,’Tokyo’,datetime(‘now’));
なんてカマして安心していると、中に入っているのはUTCというコトです。

安心しきってると、日付データがもれなく9時間ずれます。プログラム内で現在時刻と比較したり、SQL Server とかと比較したりすると、軽めに死ねそうです。

で、どうするか。

1) SQLを工夫する
select datetime(UpdateDate,’localtime’) from test2;
とすると、ローカルタイムに変換してくれます。
データセットデザイナでやると、型推論がうまくいかないのか、Object型になっちゃうのが難点。

2) DataSet でなんとかする
DataSet – DataTable の当該行を選択してプロパティ→DateTimeMode を”Utc”に変更。
そうすると、DateTime の Kind プロパティが “Utc”になるので、ToLocalTime してOK。

3) コード内でアレコレ
DBから取ってきてそのまま突っ込んでも、”Kind”プロパティが”Unspecified”のママです。ようするに、「時刻がUTCか地方時なのか知らないけど、とにかく入ってるよ。」状態ってことです。
まぁ、確かに日本は夏時間もないのでそのまま9時間加算してあげれば良いような気もします。ただ何となく個人的にどうにも居心地が悪いのです。
やるとすれば、こんな感じかなと…

‘—-まずはDBから取ってきた生の状態が DateTime の中身。
Dim dteResult As DateTime = CDate(objCommand.ExecuteScalar())
‘—-これをUTC時刻として(つまりオフセット0で) DateTimeOffset に入れる。
Dim dtoLocal As New DateTimeOffset(dteResult, New TimeSpan(0))
‘—-ここで、地方時を呼び出す
Console.WriteLine(dtoLocal.LocalDateTime)
‘—-これできちんと地方時に変換されました。


ま、どの方法がどうこうもあるけど、知っとかないと痛手くらいそうな場所なのでメモ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Spam Protection by WP-SpamFree