Chrono: Rust 日付・時刻ライブラリ

Chrono は、グレゴリオ暦における正確な日付・時刻操作に必要な全機能を提供することを目指しています:

  • DateTime型はデフォルトでタイムゾーンを認識し、同時にタイムゾーン非依存の独立型も提供します。
  • 無効または曖昧な日付・時刻を生成する可能性のある操作はOptionまたはMappedLocalTimeを返します。
  • strftimeにインスパイアされた日付・時刻フォーマット構文による設定可能な解析・フォーマット機能。
  • Localタイムゾーンはオペレーティングシステムの現在のタイムゾーンで動作します。
  • 型と操作の実装は合理的な効率性を考慮しています。
  • バイナリサイズを制限するため、Chronoはデフォルトでタイムゾーンデータを含みません。完全なタイムゾーンサポートには付属クレートChrono-TZまたはtzfileを使用してください。

機能特性

Chrono は様々なランタイム環境とオペレーティングシステムをサポートし、いくつかの有効化・無効化可能な機能を持っています。

デフォルト機能:

  • alloc:メモリ割り当てに依存する機能(主に文字列フォーマット)を有効化。
  • std:標準ライブラリに依存する機能を有効化。これはallocの上位セットで、標準ライブラリの型とトレイトとの相互運用性を追加します。
  • clock:ローカルタイムゾーン(Local)の読み取り機能を有効化。これはnowの上位セットです。
  • now:システム時刻(now)の読み取り機能を有効化。
  • wasmbind:wasm32ターゲット向けにJS Date APIとのインターフェースを提供。

オプション機能:

  • serde:serdeによるシリアライズ/デシリアライズを有効化。
  • rkyv:非推奨、rkyv-*機能を使用してください。
  • rkyv-16rkyv-32rkyv-64:rkyvによるシリアライズ/デシリアライズを有効化(それぞれ16ビット、32ビット、64ビット整数を使用)。
  • rkyv-validation:bytecheckによるrkyv検証サポートを有効化。
  • arbitrary:Arbitraryクレートを使用して型の任意のインスタンスを構築。
  • unstable-locales:ローカライゼーションを有効化。これにより_localizedサフィックス付きの様々なメソッドが追加されます。

概要

時間差/期間

Chronoは時間スパンの大きさを表すTimeDelta型を提供します。これは秒とナノ秒で表される「正確な」期間であり、日や月などの「名目上の」構成要素は表しません。

TimeDelta型は以前Durationという名前でした(型エイリアスとして引き続き利用可能)。類似のcore::time::Durationとの顕著な違いは、符号付き値であることです。

日付と時刻

Chronoはタイムゾーン内の日付と時刻を表すDateTime型を提供します。

DateTimeはタイムゾーンを認識し、ローカル日付をUTC日付に変換する方法とその逆を定義するTimeZoneオブジェクトから構築する必要があります。よく知られたTimeZone実装は3つあります:

  • UtcはUTCタイムゾーンを指定します。最も効率的です。
  • Localはシステムのローカルタイムゾーンを指定します。
  • FixedOffsetはUTC+09:00やUTC-10:30などの任意の固定タイムゾーンを指定します。

異なるTimeZone型のDateTimeは別個の型であり混在できませんが、DateTime::with_timezoneメソッドを使用して相互変換できます。

現在の日付と時刻はUTCタイムゾーン(Utc::now())またはローカルタイムゾーン(Local::now())で取得できます。

use chrono::prelude::*;

let utc: DateTime<Utc> = Utc::now(); // 例:`2014-11-28T12:45:59.324310806Z`
let local: DateTime<Local> = Local::now(); // 例:`2014-11-28T21:45:59.324310806+09:00`

さらに、独自の日付と時刻を作成することもできます:

use chrono::offset::MappedLocalTime;
use chrono::prelude::*;

let dt = Utc.with_ymd_and_hms(2014, 7, 8, 9, 10, 11).unwrap(); // `2014-07-08T09:10:11Z`

フォーマットと解析

フォーマットはformatメソッドで行われ、そのフォーマットは馴染みのあるstrftimeフォーマットと同等です。

デフォルトのto_stringメソッドと{:?}指定子も合理的な表現を提供します。Chronoは一般的なフォーマット用にto_rfc2822to_rfc3339メソッドも提供します。

Chronoは現在、追加のCライブラリなしでほぼすべての言語での日付フォーマット機能を提供します。この機能はunstable-locales特性で利用可能です:

use chrono::prelude::*;

let dt = Utc.with_ymd_and_hms(2014, 11, 28, 12, 0, 9).unwrap();
assert_eq!(dt.format("%Y-%m-%d %H:%M:%S").to_string(), "2014-11-28 12:00:09");
assert_eq!(dt.format_localized("%A %e %B %Y, %T", Locale::fr_BE).to_string(), 
           "vendredi 28 novembre 2014, 12:00:09");

解析は2つの方法で行えます:

  1. 標準のFromStrトレイト(および文字列のparseメソッド)はDateTime<FixedOffset>DateTime<Utc>DateTime<Local>値の解析に使用できます。
  2. DateTime::parse_from_strはオフセット付きの日付と時刻を解析し、DateTime<FixedOffset>を返します。
use chrono::prelude::*;

let dt = "2014-11-28T12:00:09Z".parse::<DateTime<Utc>>().unwrap();
let fixed_dt = DateTime::parse_from_str("2014-11-28 21:00:09 +09:00", "%Y-%m-%d %H:%M:%S %z").unwrap();

EPOCHタイムスタンプとの変換

UNIXタイムスタンプからDateTime<Utc>を構築するにはDateTime::from_timestamp(seconds, nanoseconds)を使用します。

DateTimeからタイムスタンプ(秒単位)を取得するにはDateTime.timestampを使用します。さらに、追加のナノ秒数を取得するにはDateTime.timestamp_subsec_nanosを使用できます。

use chrono::{DateTime, Utc};

// epochからdatetimeを構築:
let dt: DateTime<Utc> = DateTime::from_timestamp(1_500_000_000, 0).unwrap();
assert_eq!(dt.to_rfc2822(), "Fri, 14 Jul 2017 02:40:00 +0000");

// datetimeからepoch値を取得:
let dt = DateTime::parse_from_rfc2822("Fri, 14 Jul 2017 02:40:00 +0000").unwrap();
assert_eq!(dt.timestamp(), 1_500_000_000);

制限事項

  • 順方向のグレゴリオ暦のみをサポート(より早い日付をサポートするように拡張)。
  • 日付型は紀元前後約262,000年までに制限。
  • 時刻型はナノ秒精度に制限。
  • 閏秒を表現可能だが、Chronoは完全にはサポートしていない。