at backyard

Color my life with the chaos of trouble.

Rustで日付のsortを行う(chrono使用)

今日もRustに関する備忘録。

Rustで日付を扱う際はchronoがよく使われているよう。

docs.rs

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_byOrderingenum のいずれかの値を返すことでソートを行えるようであった。

doc.rust-lang.org

今回の場合、chrono側で日時の比較した差をDuration型で管理できるようだったので、num_millisecondsを用いて差分を比較することで日付のソートを行うことにした。

docs.rs

もしかしたら他に最適解があるかもしれないが、一旦これで実現したい挙動はできた。