SpecFormula AI
ISA後端符號系統

TIME-System

時間表達式解析

TIME-System 提供三個函式,將宣告式的時間表達式轉換為型別安全的時間物件。

三個函式

函式用途Java 型別C# 型別
@time(expr)完整日期時間ZonedDateTimeDateTimeOffset
@date(expr)僅日期LocalDateDateOnly
@localtime(expr)僅時間LocalTimeTimeOnly

絕對時間

# ISO 8601 格式
@time("2025-11-04T08:00:00")
@time("2025-11-04T08:00:00+08:00")
@time("2025-11-04T08:00:00Z")

# 僅日期(預設 00:00:00)
@time("2025-11-04")

# 日期函式
@date("2025-11-04")
@date("2025/12/16")

# 時間函式
@localtime("21:00")
@localtime("21:00:30")

相對時間

基於當前(或 Mock)時間計算:

@time("now")         # 當前時間
@time("now-1d")      # 昨天
@time("now+1h")      # 一小時後
@time("now-1M-1d")   # 一個月又一天前

時間單位

單位符號範例
s(小寫)now-30s
m(小寫)now+5m
h(小寫)now-2h
d(小寫)now+7d
M(大寫)now-1M

搭配 Mock 時間

當透過 TimeControl 設定 Mock 時間時,now 會使用 Mock 時間:

Given 現在時間為 "2026-02-01T10:00:00"
When 創建日誌, call table:
  | logTime       |
  | @time("now-1d") |    # → 2026-01-31T10:00:00

時區處理

輸入格式時區行為
2025-11-04T08:00:00+08:00使用指定時區
2025-11-04T08:00:00Z使用 UTC
2025-11-04T08:00:00使用系統預設時區

型別安全

TIME-System 回傳正確的時間型別,而非字串:

# ❌ 純字串,無型別保證
| eventTime           |
| 2025-11-04T08:00:00 |

# ✅ 回傳 ZonedDateTime,型別正確
| eventTime                    |
| @time("2025-11-04T08:00:00") |

使用限制

TIME-System 不可直接搭配 VAR 擷取鍵使用:

# ❌ 不支援
| >eventTime                   |
| @time("2026-01-15T09:00:00") |

# ✅ 正確:從執行結果擷取
| >eventTime |
| <createdAt |

錯誤處理

解析失敗時拋出明確例外:

無法解析時間表達式: @time("invalid")。
支援格式:ISO 8601 (2025-11-04T08:00:00)、日期 (2025-11-04)、相對時間 (now, now-1d)

完整範例

Feature: 時間表達式

  Background:
    Given 現在時間為 "2026-01-27T10:00:00"

  Example: 使用各種時間表達式
    # 絕對時間
    Given 準備一個活動, with table:
      | name   | startTime                    |
      | 會議   | @time("2026-01-28T14:00:00") |

    # 相對時間
    Given 準備一個任務, with table:
      | name   | dueDate        |
      | 報告   | @time("now+7d")  |

    # 僅日期
    Given 準備一個使用者, with table:
      | name  | birthday            |
      | Alice | @date("2000-01-15") |

目錄