Skip to main content

swarm_engine_core/util/
time.rs

1//! Time utilities - UNIX epoch ベースの時刻関数
2
3use std::time::{SystemTime, UNIX_EPOCH};
4
5/// UNIX epoch からのミリ秒
6///
7/// 用途: `created_at`, `timestamp_ms` 等の永続化フィールド
8#[inline]
9pub fn epoch_millis() -> u64 {
10    SystemTime::now()
11        .duration_since(UNIX_EPOCH)
12        .map(|d| d.as_millis() as u64)
13        .unwrap_or(0)
14}
15
16/// ID 生成用タイムスタンプ
17///
18/// `counter` と組み合わせて一意性を確保。
19/// - epoch_millis: ソート可能性(ordering)
20/// - counter: 同一 ms 内の順序保証 + NTP 巻き戻り耐性
21///
22/// # Note
23///
24/// NTP 同期で時刻が戻る可能性があるため、
25/// ID の一意性・順序性は `counter` に依存する。
26#[inline]
27pub fn epoch_millis_for_ordering() -> u64 {
28    epoch_millis()
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    #[test]
36    fn test_epoch_millis_returns_nonzero() {
37        let ts = epoch_millis();
38        assert!(ts > 0);
39    }
40
41    #[test]
42    fn test_epoch_millis_for_ordering_same_as_epoch_millis() {
43        let ts1 = epoch_millis();
44        let ts2 = epoch_millis_for_ordering();
45        // 同じ実装なので、ほぼ同じ値(数ms以内の差)
46        assert!((ts1 as i64 - ts2 as i64).abs() < 100);
47    }
48
49    #[test]
50    fn test_epoch_millis_monotonic_in_short_term() {
51        let ts1 = epoch_millis();
52        let ts2 = epoch_millis();
53        // 短期間では単調増加(または同値)
54        assert!(ts2 >= ts1);
55    }
56}