c# 时间日期转换

·

1 min read

引言

日常开发中,经常会遇到字符串和DateTime类型转换、不同时区之间的日期转换。这里讲解下

转换UTC

TimeZoneInfo.ConvertTimeToUtc(DateTime dateTime, TimeZoneInfo sourceTimeZone)

显式指定时区,转换utc

var zone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
var date = Convert.ToDateTime("1995-07-14T10:05:00.0000000-03:00");
// 注:如果date本身就是zone时区,使用TimeZoneInfo.ConverTimeToUtc会抛出"ArgumentException"异常
// 这里统一讲DateTime.Kind修改为 Unspecified 可解决
var date2 = DateTime.SpecifyKind(date , DateTimeKind.Unspecified);
var utcTime = TimeZoneInfo.ConvertTimeToUtc(date2, zone); // Kind属性值为Utc

输出

07/14/1995 13:05:00

TimeZoneInfo.ConvertTime( DateTimeOffset dateTimeOffset, TimeZoneInfo destinationTimeZone)

使用 DateTimeOffset

var dto = DateTimeOffset.Parse("1995-07-14T10:05:00.0000000-03:00");
DateTimeOffset utcTimeOffset = TimeZoneInfo.ConvertTime(dto, TimeZoneInfo.Utc);
DateTime utcTime = utcTimeOffset.DateTime; // Kind属性为Unspecified

输出:

07/14/1995 13:05:00

扩展: DateTime和DateTimeOffset的区别

  1. DateTime

    • DateTime表示一个特定的日期和时间,但它不包含关于时区的信息。Kind属性值只有本地时间(DateTimeKind.Local)或UTC时间(DateTimeKind.Utc)。

    • DateTime包含日期、时间和一些方法用于处理日期和时间。

    • 当使用DateTime时,你需要额外的信息来确定时间是本地时间还是UTC时间。

  2. DateTimeOffset

    • DateTimeOffset结构也表示一个特定的日期和时间,但它同时包含了与时区有关的信息。

    • DateTimeOffset包含一个DateTime值以及一个TimeSpan值,用于表示与UTC时间的偏移量。

    • DateTimeOffset结构更适合在应用程序中处理多个时区的日期和时间,因为它可以明确地指定日期时间是相对于UTC时间的偏移量。

主要区别总结如下:

  • DateTime不包含时区信息,而DateTimeOffset包含时区信息。

  • DateTime用于表示特定日期时间,而DateTimeOffset除了日期时间外还包含了偏移量信息。

  • DateTime更适合用于本地时间和UTC时间的表示,而DateTimeOffset更适合处理多个时区的情况。