タイムゾーンを省略したテキストから日時へ変換したい。
成果物
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時刻で保存したほうがいいか。
参考
フォーマット指定子は以下参照。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- rustc 1.36.0 (a53f9df32 2019-07-03)
- cargo 1.36.0 (c4fcfb725 2019-05-15)
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
前回まで
- Rust学習まとめ(ドキュメント)
- Rust自習(じゃんけんゲーム1)
- Rust自習(双方向リスト1)
- Rust自習(単方向リスト1)
- Rust自習(単方向リスト2)
- Rust自習(単方向リスト3)
- Rust自習(単方向リスト4)
- Rust自習(単方向リスト5)
- Rust自習(単方向リスト6)
- Rust自習(単方向リスト7)
- Rust自習(リストのインタフェースを考える)
- Rust自習(連結リスト1)
- Rust自習(連結リスト2)
- Rust自習(連結リスト3)
- Rust自習(連結リスト4)
- Rust自習(連結リストの取得系インタフェース考察)
- Rust自習(連結リスト5)
- Rust自習(連結リストの取得系インタフェース考察2)
- Rust自習(連結リスト6)
- Rust自習(連結リスト7)
- Rust自習(連結リスト8)
- Rust自習(連結リスト9)
- Rust自習(変数名でイテレートする方法)
- Rust自習(iter、iter_mut実装方法)
- Rust自習(連結リスト10)
- Rust自習(rev()実装できず)
- Rust自習(cycle()実装できず)
- Rust自習(じゃんけんゲーム2)
- Rust自習(じゃんけんゲーム3)
- Rust自習(じゃんけんゲーム4)
- Rust自習(じゃんけんゲーム5)
- Rust自習(じゃんけんゲーム6)
- Rust自習(じゃんけんゲーム7)
- Rust自習(じゃんけんゲーム8)
- Rustのアップデート(rustup update)
- Rust自習(SQLite3 1)
- Rust自習(SQLite3 2)
- Rust自習(SQLite3 3)
- Rust自習(日時 1 chrono)
- Rust自習(日時 2 chrono)