添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

前两个知识点,我们已经通过2个章节讲解完毕了,接下来就是时区了。

TimeZoneInfo 类

ASP.NET Core 或者说 C# 中和时区相关的逻辑都封装在 System 命名空间下的 TimeZoneInfo 类中。

TimeZoneInfo 类的实例有以下属性

最重要的属性有2个 Id BaseUtcOffset ,前者关系到时区的获取,或者关系到本地时间和 UTC 时间的偏差。

最最重要的事情

为了简化使用, TimeZoneInfo 有两个静态的属性 TimeZoneInfo.Utc TimeZoneInfo.Local 分别用于表示格林威治时区 ( +0UTC) 和本地时区

using System;
namespace datetime
    class Program
        static void Main(string[] args)
            Console.WriteLine(TimeZoneInfo.Utc);
            Console.WriteLine(TimeZoneInfo.Local);

输出结果如下

(UTC) Coordinated Universal Time
(UTC+08:00) China Standard Time

获取所有时区和时间偏移 TimeZoneInfo.GetSystemTimeZones()

TimeZoneInfo.GetSystemTimeZones() 返回所有支持的时区列表

using System;
namespace datetime
    class Program
        static void Main(string[] args)
            var tzi = TimeZoneInfo.GetSystemTimeZones();
            foreach (var tz in tzi)
                Console.WriteLine(tz);

运行结果如下

// 以上忽略
(UTC+08:00) Australian Western Standard Time
(UTC+08:00) Brunei Darussalam Time
(UTC+08:00) Central Indonesia Time
(UTC+08:00) China Standard Time
(UTC+08:00) China Standard Time
(UTC+08:00) Hong Kong Standard Time
(UTC+08:00) Irkutsk Standard Time
(UTC+08:00) Malaysia Time
(UTC+08:00) Malaysia Time
(UTC+08:00) Philippine Standard Time
(UTC+08:00) Singapore Standard Time
(UTC+08:00) Taipei Standard Time
(UTC+08:00) Ulaanbaatar Standard Time
(UTC+08:00) Ulaanbaatar Standard Time
(UTC+08:45) Australian Central Western Standard Time
// 以下忽略

根据时区编号获取一个时区 TimeZoneInfo.FindSystemTimeZoneById()

我们可以通过 TimeZoneInfo.GetSystemTimeZones() 返回的时区列表的 Id 来获取一个时区,使用的就是

TimeZoneInfo 的静态方法 FindSystemTimeZoneById()。比如我们要获取上海这个时区 Asia/Shanghai 则可以如下

TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai");

使用范例如下

using System;
namespace datetime
    class Program
        static void Main(string[] args)
            var tzi = TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai");
            Console.WriteLine(tzi.DisplayName);

创建一个自定义的时区 TimeZoneInfo.CreateCustomTimeZone()

我们还可以使用静态方法 TimeZoneInfo.CreateCustomTimeZone() 创建一个自定义的时区

TimeZoneInfo.CreateCustomTimeZone(
"zh",                               // 编号
TimeSpan.FromHours(8),              // 时间偏移
"中国时区",                          // 显示名称
"China time zone"                   // 可读性名称

使用范例如下

using System;
namespace datetime
    class Program
        static void Main(string[] args)
            var cnTimeZoneInfo = TimeZoneInfo.CreateCustomTimeZone("zh", TimeSpan.FromHours(8), "中国时区", "China time zone");
            Console.WriteLine(cnTimeZoneInfo.DisplayName);

跟时区相关的时间处理 DateTimeOffset.Parse()DateTimeOffset.ToOffset()

我们可以通过静态方法 DateTimeOffset.Parse() 或者实例方法 [DateTimeOffset].ToOffset() 将日期时间从一个时区切换到另一个时区

using System;
namespace datetime
    class Program
        static void Main(string[] args)
            // 获取 UTC 时间
            var dtu = DateTime.UtcNow;
            Console.WriteLine(dtu);
            // 获取 Asia/Shanghai 时区
            var tzi = TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai");
            Console.WriteLine(tzi);
            var tzo = new DateTimeOffset(dtu);
            Console.WriteLine(tzo.ToOffset(tzi.BaseUtcOffset).DateTime);

输出结果如下

10/27/2021 9:18:08 AM
(UTC+08:00) China Standard Time
10/27/2021 5:18:08 PM

这里不得不说下 DateTimeOffset 类的构造函数,它有好多个构造函数,最值得注意的就2个,DateTimeOffset(DateTime)DateTimeOffset(DateTime,TimeSpan),前者默认使用的是 UTC 时区,后者则需要传递 tzi.BaseUtcOffset 这个参数,也就是时区的时间偏移函数。

ASP.NET Core 设置默认时区 TZ 环境变量

好了,说回今天的重点,我们学习这么多,最主要的就是要知道 ASP.NET Core 如何设置默认的时区。

说起来有点悲哀,只有一种方法

使用 TZ 环境变量

Unix 类系统,比如 Ubuntu、CentOS、MacOS

export TZ=Asia/Shanghai

Windows 系统,点击 开始 -> 设置 -> 时间与语言 -> 日期与时间