ユーザ用ツール

サイト用ツール


rust:chrono

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
rust:chrono [2022/07/05 02:25] nullponrust:chrono [2023/02/22 08:27] (現在) nullpon
行 16: 行 16:
 chrono-tz = "0.6" chrono-tz = "0.6"
 ``` ```
 +
  
 ## 現在日時の取得 ## 現在日時の取得
行 28: 行 29:
 ``` ```
  
-ローカルタイムゾーンで指定した日時を取得。ymd, and_hmsを使うときは`chrono::TimeZone`を読み込む 
  
-```+## 指定時刻の取得 
 + 
 +年月日時分秒を指定してDateTimeを取得 
 + 
 +```rust
 use chrono::{Local, TimeZone}; use chrono::{Local, TimeZone};
  
-let dt = Local.ymd(2022, 7, 5).and_hms(10, 14, 31); +let result = Local.with_ymd_and_hms(2022, 7, 510, 14, 31);
-println!("{}", dt);+
 ``` ```
 +
 +`use chrono::TimeZone` が必要なことに注意。また、取得されるのはDateTimeではなく、`LocalResult<Option<DateTime>>` である
 +
 +日付が正しい場合は`single`が`Some<DateTime>`を返す
 +
 +```rust
 +let dt = Local.with_ymd_and_hms(2022, 7, 5, 10, 14, 31).single();
 +println!("{}", dt.unwrap());  // 2022-07-05 10:14:31 +09:00
 +```
 +
 +日付指定が不正な場合や、日付が1通りに定まらない場合、`single`は`None`を返す
 +
 +```rust
 +let dt = Local.with_ymd_and_hms(2022, 7, 5, 90, 14, 31).single();
 +println!("{}", dt.is_none());  // true
 +```
 +
 +アメリカ東海岸では夏時間の終了によって2023年11月5日1時30分という日時が2回発生するため1通りに定まらない
 +
 +```rust
 +let dt = chrono_tz::America::New_York.with_ymd_and_hms(2023, 11, 5, 1, 30, 0).single();
 +println!("{}", dt.is_none());  // true
 +```
 +
 +このような場合は`single`ではなく`earliest`、`latest`というメソッドでそれぞれの日時を取得できる
 +
 +```rust
 +let result = chrono_tz::America::New_York.with_ymd_and_hms(2023, 11, 5, 1, 30, 0);
 +
 +println!("{}", result.earliest().unwrap()); // 2023-11-05 01:30:00 EDT
 +println!("{}", result.latest().unwrap());   // 2023-11-05 01:30:00 EST
 +```
 +
 +matchで切り分けも可能
 +
 +```rust
 +let result = Local.with_ymd_and_hms(2022, 7, 5, 10, 14, 31);
 +match result {
 +    LocalResult::Single(dt) => println!("{}", dt),   
 +    LocalResult::Ambiguous(dt1, dt2) => println!("{} {}", dt1, dt2),
 +    LocalResult::None => println!("invalid date")
 +}
 +```
 +
 +ちなみに過去の日本でもGHQ占領下でサマータイム制が施行されている(1948〜1951年)
 +
 +```
 +let result = chrono_tz::Asia::Tokyo.with_ymd_and_hms(1951, 5, 6, 0, 30, 0);
 +match result {
 +    LocalResult::Single(dt) => println!("{}", dt),
 +    LocalResult::Ambiguous(dt1, dt2) => println!("{} {}", dt1, dt2),
 +    LocalResult::None => println!("invalid date")
 +}
 +
 +let result = chrono_tz::Asia::Tokyo.with_ymd_and_hms(1951, 9, 9, 0, 30, 0);
 +match result {
 +    LocalResult::Single(dt) => println!("{}", dt),
 +    LocalResult::Ambiguous(dt1, dt2) => println!("{} {}", dt1, dt2),
 +    LocalResult::None => println!("invalid date")
 +}
 +```
 +
 +```
 +invalid date
 +1951-09-09 00:30:00 JDT 1951-09-09 00:30:00 JST
 +```
 +
 +
 +</markdown>
rust/chrono.1656987915.txt.gz · 最終更新: 2022/07/05 02:25 by nullpon