我们正在将XML DateTime值解析为DateTimeOffset值。根据W3C XSD documentation for DateTime,该类型可能具有时区信息或没有。
我们的要求是:
- 如果XML中提供了时区信息,请使用此时区 - 如果未提供时区信息,则假定它是预定义的、可配置的时区中的本地时间(不是服务器上的时区)。
问题在于,当将没有时区的XML DateTime解析为DateTimeOffset时,默认情况下会使用本地(系统)时区。似乎无法覆盖默认时区,并且也无法确定时区是在解析期间被解析还是自动添加的。
有没有办法指定DateTimeOffset解析使用的默认时区? 如果没有,如何确定是否在DateTimeOffset解析期间解析了时区或自动添加了时区?
对我来说,似乎奇怪的是,没有像设置当前文化一样设置.NET应用程序的时区的支持。
因此,解决这个问题的唯一方法似乎是先将值解析为DateTime,然后检查其Kind属性。如果Kind不是未指定,则再次将值解析为DateTimeOffset:
我们的要求是:
- 如果XML中提供了时区信息,请使用此时区 - 如果未提供时区信息,则假定它是预定义的、可配置的时区中的本地时间(不是服务器上的时区)。
问题在于,当将没有时区的XML DateTime解析为DateTimeOffset时,默认情况下会使用本地(系统)时区。似乎无法覆盖默认时区,并且也无法确定时区是在解析期间被解析还是自动添加的。
有没有办法指定DateTimeOffset解析使用的默认时区? 如果没有,如何确定是否在DateTimeOffset解析期间解析了时区或自动添加了时区?
对我来说,似乎奇怪的是,没有像设置当前文化一样设置.NET应用程序的时区的支持。
因此,解决这个问题的唯一方法似乎是先将值解析为DateTime,然后检查其Kind属性。如果Kind不是未指定,则再次将值解析为DateTimeOffset:
/*
sample values:
- 2015-06-03T10:47:01
- 2015-06-03T07:47:01Z
- 2015-06-03T10:47:01+03:00
*/
DateTimeOffset dto;
var timeZone = TimeZoneInfo.FindSystemTimeZoneById(ConfigurationManager.AppSettings["DefaultTimeZone"]);
var dt = DateTime.Parse(value);
if (dt.Kind == DateTimeKind.Unspecified)
{
dto = new DateTimeOffset(dt, timeZone.GetUtcOffset(dt));
}
else
{
dto = DateTimeOffset.Parse(value);
}