UTCからローカルタイムへの変換

nobu_kichi2008-04-03


Qtで日時を扱う場合、QDateTimeクラスを使うと便利です。UTCからローカルタイムへ変換するにはtoLocalTime関数を使います。その際、QDateTimeのインスタンスにはtimeSpecプロパティとしてあらかじめ、Qt::UTCを設定しておく必要があります。デフォルトではQt::LocalTimeが設定されてしまうので、注意が必要です。

例えば、Twitter APIで取得した時刻データ(UTC)をローカルタイムに変換する場合、以下のように書きます。


inline QDateTime twitterTimeToLocalTime(const QString& twitterDateTime)
{
//! Twitter returns date and time in a format like this:
//! "Tue Feb 19 20:56:22 +0000 2008";
//! 0 1 2 3 4 5 <- index
QStringList stringList = twitterDateTime.split(" ");
if (stringList.size() == 6) {
QDate date(stringList[5].toInt(), engMonthToInt(stringList[1]), stringList[2].toInt());
QTime time = QTime::fromString(stringList[3], "hh:mm:ss");
QDateTime dateTime(date, time, Qt::UTC); //! Qt::UTCを指定するのを忘れずに
return dateTime.toLocalTime();

} else {
//! oops the given string is in unexpected format
return QDateTime::currentDateTime();
}
}

これを以下のように書くと期待通りには動きません。



//! 期待通りにうごきません。マネしちゃだめよ。
QDateTime dateTime(date, time);
dateTime.setTimeSpec(Qt::UTC);
return dateTime.toLocalTime();