NodaTime 是 .NET 平台下功能强大的日期和时间处理库,旨在替代和增强系统自带的 DateTime 类型。它解决了 DateTime 在时区、夏令时、精度等方面的诸多不足,提供更准确、灵活的时间计算和转换能力。
主要特点:
- 明确区分本地时间、UTC 时间、带时区时间等类型
- 支持全球时区和夏令时规则
- 精确的时间间隔和周期计算
- 易于与 ISO 标准和其他时间格式互操作
用法举例
1. 获取当前时间(本地/UTC)
using NodaTime;
var now = SystemClock.Instance.GetCurrentInstant(); // 获取当前 UTC 时间点
var localDateTime = now.InZone(DateTimeZoneProviders.Tzdb["Asia/Shanghai"]).ToLocalDateTime();
Console.WriteLine(localDateTime); // 输出上海本地时间
2. 时区转换
using NodaTime;
var instant = Instant.FromDateTimeUtc(DateTime.UtcNow);
var nyTime = instant.InZone(DateTimeZoneProviders.Tzdb["America/New_York"]);
Console.WriteLine(nyTime); // 输出纽约时间
3. 计算时间间隔
using NodaTime;
var start = new LocalDateTime(2025, 10, 1, 8, 0);
var end = new LocalDateTime(2025, 10, 8, 8, 0);
var period = Period.Between(start, end, PeriodUnits.Days);
Console.WriteLine(period.Days); // 输出: 7
说明:
Instant表示绝对时间点(UTC)。DateTimeZoneProviders.Tzdb提供全球时区数据。Period用于表示时间间隔,支持年、月、日、时、分、秒等单位。- 适合需要精确时区处理、跨时区计算、避免
DateTime常见坑的场景。
更多用法可参考官方文档:NodaTime 官网。