Rustで日付のsortを行う(chrono使用)
今日もRustに関する備忘録。
Rustで日付を扱う際はchrono
がよく使われているよう。
chronoを用いた状況で日付を新しい順・古い順にソートするやり方について試行錯誤した結果を備忘録として書き残しておく。
例として下記のような構造の配列を持っているとする。
struct Item { name: String, date: DateTime<FixedOffset>, } let mut item_list: Vec<Item> = ...
そして、この item_list
を新しい順でソートしたい場合、sort_by
を使って下記のように書けるようだ。
(判定結果を逆にすればそのまま古い順でソートできる)
ちなみに予め use std::cmp::Ordering;
と記述しておく必要がある。
item_list.sort_by(|a, b| { let duration: Duration = a.date - b.date; if duration.num_milliseconds() > 0 { Ordering::Less } else if duration.num_milliseconds() == 0 { Ordering::Equal } else { Ordering::Greater } });
どうやらsort_by
は Ordering
の enum
のいずれかの値を返すことでソートを行えるようであった。
今回の場合、chrono側で日時の比較した差をDuration型で管理できるようだったので、num_milliseconds
を用いて差分を比較することで日付のソートを行うことにした。
もしかしたら他に最適解があるかもしれないが、一旦これで実現したい挙動はできた。