我无法使用DateTime.Now
,因为服务器不一定位于加利福尼亚州
问问题
17235 次
1 回答
42
两种选择:
1)使用TimeZoneInfo
和DateTime
:
using System;
class Test
{
static void Main()
{
// Don't be fooled - this really is the Pacific time zone,
// not just standard time...
var zone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var utcNow = DateTime.UtcNow;
var pacificNow = TimeZoneInfo.ConvertTimeFromUtc(utcNow, zone);
Console.WriteLine(pacificNow);
}
}
2) 使用我的Noda Time项目 :)
using System;
using NodaTime;
class Test
{
static void Main()
{
// TZDB ID for Pacific time
DateTimeZone zone = DateTimeZoneProviders.Tzdb["America/Los_Angeles"];
// SystemClock implements IClock; you'd normally inject it
// for testability
Instant now = SystemClock.Instance.Now;
ZonedDateTime pacificNow = now.InZone(zone);
Console.WriteLine(pacificNow);
}
}
显然我有偏见,但我更喜欢使用 Noda Time,主要有以下三个原因:
- 您可以使用 TZDB 时区信息,该信息在 Windows 之外更具可移植性。(您也可以使用基于 BCL 的区域。)
- 各种不同的信息有不同的类型,避免了
DateTime
试图表示三种不同的值的奇怪,没有只表示“日期”或“一天中的时间”的概念 - 它的设计考虑到了可测试性
于 2013-02-21T22:55:07.000 回答