やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rust自習(日時 3 chrono)

 タイムゾーンを省略したテキストから日時へ変換したい。

成果物

FixedOffset

 FixedOffsetを使ってタイムゾーンを省略できないかと思ったが、できない……。

    let dt = chrono::offset::FixedOffset::east(9*3600).parse_form_str("2000-01-02 03:04:05", "%Y-%m-%d %H:%M:%S"); // error[E0599]: no method named `parse_form_str` found for type `chrono::offset::fixed::FixedOffset` in the current scope

 以下のように数値からは作成できる。

    let dt = chrono::offset::FixedOffset::east(9*3600).ymd(2000, 1, 2).and_hms(3, 4, 5);

 でも、SQLite3のテキストデータYYYY-mm-dd HH:MM:SSの書式からローカル日時を作りたいのに……。こうなったらDBデータの末尾に+09:00を付与してparse_form_strするしかないのか? タイムゾーンのハードコーディングとか糞すぎる……。

タイムゾーン指定子を無理やり付与

use chrono::prelude::*;
fn main() {
    let date_str = "2000-01-02 03:04:05";
    let dt = DateTime::parse_from_str(format!("{} {}", date_str, Local::now().format("%z")).as_str(), "%Y-%m-%d %H:%M:%S %z");
    println!("{}", dt.unwrap());
}

 一応できた。

 なんと冗長なコードか……。文字列結合すら面倒なことになる。

 あとこれ、実行環境によってタイムゾーンが変わりうるため、正確な時刻が復元される保証はない。もういっそSQLite3のファイル名にタイムゾーン書くか? もしくは設定用テーブルでも用意してタイムゾーンを保存しておくか。あるいはUTCで保存するか。

 そんなことするくらいなら、UTC時刻で保存したほうがいいか。

参考

 フォーマット指定子は以下参照。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで