10

我无法使用DateTime.Now,因为服务器不一定位于加利福尼亚州

4

1 回答 1

42

两种选择:

1)使用TimeZoneInfoDateTime

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 回答