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的区别
DateTime:
DateTime
表示一个特定的日期和时间,但它不包含关于时区的信息。Kind属性值只有本地时间(DateTimeKind.Local)或UTC时间(DateTimeKind.Utc)。
DateTime
包含日期、时间和一些方法用于处理日期和时间。当使用
DateTime
时,你需要额外的信息来确定时间是本地时间还是UTC时间。DateTimeOffset:
DateTimeOffset
结构也表示一个特定的日期和时间,但它同时包含了与时区有关的信息。
DateTimeOffset
包含一个DateTime
值以及一个TimeSpan
值,用于表示与UTC时间的偏移量。
DateTimeOffset
结构更适合在应用程序中处理多个时区的日期和时间,因为它可以明确地指定日期时间是相对于UTC时间的偏移量。主要区别总结如下:
DateTime
不包含时区信息,而DateTimeOffset
包含时区信息。
DateTime
用于表示特定日期时间,而DateTimeOffset
除了日期时间外还包含了偏移量信息。
DateTime
更适合用于本地时间和UTC时间的表示,而DateTimeOffset
更适合处理多个时区的情况。
0
Subscribe to my newsletter
Read articles from shiney directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
