DateTimeで日本時間を保存したい。

2024/02/12に公開

💡Tips

DateTime.now().toIso8601String();を使うと9時間ぐらい時間がズレるらしい?
日本時間を取得したいんですよね。

DateTime.now().toUtc().toIso8601String();にすればできるらしい?

toIso8601Stringをつけるとどうなる?

AIに聞いてみた!

DateTime.now().toUtc().toIso8601String()を使用すると、現在の日時をUTC(協定世界時)でISO 8601形式の文字列に変換します。これにより、タイムゾーンが異なる場所でも同じ時間を表現できます。

サンプルコード:

void main() {
  final jaUtc = DateTime.now().toUtc().toIso8601String();
  final utc = DateTime.now().toIso8601String();
  print('日本時間: $jaUtc');
  print('ISO 8601形式の文字列に変換: $utc');
}

実行結果:

時間の知識がないので、わからないがその時によって誤差が出てくることがあるらしい?
今回、日本時間で現在時刻を取得して、RDBにデータを保存する方法を調べていたので試してみた。

Supabaseを今回使ってるのでデータ型も調べてみた。今回は、Timestampでやってた気がします。

データ型 説明
Bool Boolean値に適したデータ型です。例えば、ユーザーがニュースレターの受信を許可しているかどうかをチェックするallowed_newslettersというカラムに適しています。
Date 時間を含まない日付値を保持します。これに適したカラムの例はbirth dayです。
Float4 単精度浮動小数点数です。範囲は±1.18×10−38から±3.4×1038です。
Float8 倍精度浮動小数点数で、範囲は±2.23×10−308から±1.80×10308です。お金のような高精度が必要な値に使用することができます。
Int2 -32,768から32,767までの数値を含むことができます。このデータ型に適したカラムの例はhuman_bonesです。人体の骨の数がこの数を超えることはないためです。
Int4 -2,147,483,648から+2,147,483,647までの数値を含むことができます。このデータ型に適したカラムの例はauctions_per_dayです。1日は84,600秒であり、オークションのプロセスは同期的で新しい価格の処理に少なくとも1秒かかるため、2,147,483,648のオークションを持つことはほぼ不可能です。
Int8 -9,223,372,036,854,775,808から+9,223,372,036,854,775,807までの数値を含むことができます。このデータ型に適したカラムの例はcorona_cases_per_dayです。世界の総人口がこの数以下であり、たとえ全員が同じ日にコロナに感染したとしても、このデータ型でまだ収容できます。
Json jsonデータを保持します。再利用が必要なjson入力を保存するのに適しています。
Jsonb jsonを保存するためのより良い方法です。jsonデータのインデックスをサポートするjsonの分解バイナリ形式です。jsonのカラムはjsonbにも適しています。したがって、jsonbの使用が推奨されます。
Text 上限を定義せずに文字列を保存するために使用されます。
Time 1日の時間のみを取ります。start_timestop_timeなどのカラムに役立つかもしれません。
Timestamp 日付と時間を保存します。created_timemodified_timeなどのデータに役立つかもしれません。
Timestamptz タイムゾーン付きの日付と時間を保存し、UTC時間を使用します。将来の時間を設定したい場合や、タイムゾーンが含まれているため、変動の機会が許されないようなデータを保持する場合に役立つかもしれません。
Timetz タイムゾーン付きの1日の時間のみを取ります。
Uuid 特定のデータベースエンティティのためのユニバーサル一意識別子です。大学の学籍番号や顧客IDなどのデータに適しています。
Varchar 文字列を保存するために使用され、上限を定義することができます。

まとめ

今回は、Dartで日本時間の取得をして、PostgreSQLに保存する方法の調査をしていたときの、メモがわりに記事を書いてみました。時間を扱うロジックを考えるのは難しいな〜と悩まされました💦

参考にした記事:
https://medium.com/flutter-jp/datetime-17e618c8e26e

Discussion