概要
Rustで日時を扱うの記事にある通り、Rustでは日時を扱うのに、chrono
クレートを使用することが多いと思います。
今回はこのchronoクレートを使用して、日本時間の今日日付・0時0分0秒を取得してみたいと思います。
実装方針
- 概要欄で紹介した記事の、TimeZone有りの型から無しの型への変換、またはその逆の項にある通り、まずは
Utc::now()
でUTCの現在日時を取得します。後続の処理用にnaive_utc
に変換しておきます。 - 上記の1で取得した
naive_utc
をchrono-tzのクレートを使用して、日本時間に変換します。How do I go from a NaiveDate to a specific TimeZone with Chrono?のstackoverflowの回答が参考になります。 - 最後に取得した日本時間の日時に、0時0分0秒を設定します。Rustの日付時刻処理(std::time, time, chrono)の「例: タイムゾーン指定で時刻を組み立てる (一意に決まる場合)」にある通り、and_hmsで全て0に設定すればいけそうです。
実装サンプル
use chrono::{DateTime, Datelike, TimeZone, Utc};
use chrono_tz::{Asia::Tokyo, Tz};
// 日本時間当日を0時0分0秒で返す
pub fn get_now_jst_date() -> DateTime<Tz> {
let utc = Utc::now().naive_utc();
let jst = Tokyo.from_utc_datetime(&utc);
return Tokyo
.ymd(jst.year(), jst.month(), jst.day())
.and_hms(0, 0, 0);
}