LoginSignup
3
2

More than 1 year has passed since last update.

そもそも、時間の取り扱いってどうすれば良いんだっけ?

Last updated at Posted at 2022-07-07

はじめに

時間を使いたいんじゃ
時間の管理ってなんじゃ?
そも、RustのChronoというライブラリが言っとるNaive、Local、Utcってなんじゃ。
タイムゾーンがどうのこうの、JSTだのESTだの知った風なことを言ってたんじゃが
ぶっちゃけ知らんかったわい。
時間とは奥深いものよのぅ。

動機

まぁ、正直良くわからなかったので挙動とか調べてみた。

結論

Localで管理する、というのがベスプラになる!
地球上、どこで起動しても、正しい現地時間を表示できるよ!

前提条件

  1. ある地域の現地時間の朝9時を基準に時間を計算をしたい!
  2. 時差情報はOSから取って来たい!
  3. 時差を手動で修正したくない!

これらをまるっとやってくれるのがLocalという型なのである。

fn main() {
    time("2022-10-11");
}

fn time(start: &str) {
    let start_time = "9:30";
    let start = format!("{}-{}", start, start_time);
    let start_naive_date_time = NaiveDateTime::parse_from_str(&start, "%Y-%m-%d-%H:%M").unwrap();
    println!("素のお時間: {:?}", start_naive_date_time);
    let local_date_time = Local.from_local_datetime(&start_naive_date_time).unwrap();
    println!("現地時間: {}", local_date_time);
    let jst = local_date_time.with_timezone(&FixedOffset::east(9 * 3600));
    println!("日本標準時(UTC+9): {}", jst);
    let washington_time = local_date_time.with_timezone(&FixedOffset::east(-4 * 3600));
    println!("アメリカワシントン: {}", washington_time);
}

実行結果

素のお時間: 2022-10-11T09:30:00
現地時間: 2022-10-11 09:30:00 +09:00
日本標準時(UTC+9): 2022-10-11 09:30:00 +09:00
アメリカワシントン: 2022-10-10 20:30:00 -04:00

まぁ、日本でやってるので、現地時間と日本時間は同じになりますわなぁ。

じゃあ、どこか遠い日本とはかなり時差の離れたところの現地時刻9時が日本時間とワシントン時間で表すとどうなるかを確認してみよう。

ヌクアロファってなんじゃ?まぁ離れてそうだからここで良いや。トンガに有るらしい。
image.png

というわけで、実行してみた。

素のお時間: 2022-10-11T09:30:00
現地時間: 2022-10-11 09:30:00 +13:00
日本標準時(UTC+9): 2022-10-11 05:30:00 +09:00
アメリカワシントン: 2022-10-10 16:30:00 -04:00

正しく、時差情報がLocal先生の力によって更新されている
あと、日本の時間とアメリカ(ワシントン)の時間も、現地時間におけるUTC差分で計算されている。

トンガの時差:UTCから13時間進んでいる
日本の時差:UTCから9時間進んでいる
アメリカ(ワシントン)の時差:UTCから4時間遅れている
UTC:時差の基準となる時間。つまり時差は0

これらを考えるとトンガが9時のときは、UTCが前日の20時を指している。
日本はUTC+9時間なので、5時
アメリカはUTC-4なので、16時

と言う感じになり、もしLocalという型がなければこれを手で計算しなければならぬ。
Localのお陰で手計算しなくて済むというわけですな。お便利ですね。

おまけ

Date(時刻情報がない日付のみ)の場合はどうなるんだろう????

fn time(start: &str) {
    let start_time = "9:30";
    let start = format!("{}-{}", start, start_time);
    let start_naive_date_time = NaiveDate::parse_from_str(&start, "%Y-%m-%d-%H:%M").unwrap();
    println!("素のお時間: {:?}", start_naive_date_time);
    let local_date_time = Local.from_local_date(&start_naive_date_time).unwrap();
    println!("現地時間: {}", local_date_time);
    let jst = local_date_time.with_timezone(&FixedOffset::east(9 * 3600));
    println!("日本標準時(UTC+9): {}", jst);
    let washington_time = local_date_time.with_timezone(&FixedOffset::east(-4 * 3600));
    println!("アメリカワシントン: {}", washington_time);
}

実行結果

素のお時間: 2022-10-11
現地時間: 2022-10-11+13:00
日本標準時(UTC+9): 2022-10-11+09:00
アメリカワシントン: 2022-10-11-04:00

その日に丸め込まれるらしい。
地球上であれば時差は24時間以内に収まるので、どの地域でもその日として計算されるわけですな。奥深いものですなぁ。

まとめ

DateTimeは強い。
時差情報をいい感じにOSから取ってきて計算してくれる。
Dateは時差関係なくその日として扱われる。
時間の情報がないので時差情報も適用されない。

DateTime<Naive>:時差情報なし
DateTime<Local>:時差情報あり
DateTime<Utc>:時差を計算するための基準時刻

ものぐさな方へのまとめ

文章が長い、読むのめんどいけどなんて?
Local使っとけばいいっすよ。つよいから。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2