【发布时间】:2015-08-23 19:20:03
【问题描述】:
我们正在将 XML DateTime 值解析为 DateTimeOffset 值。根据W3C XSD documentation for DateTime,该类型可能有或没有时区信息。
我们的要求是:
- 如果时区信息以 XML 格式提供,请使用该时区
- 如果未提供时区信息,则假定它是预定义的可配置时区中的本地时间(不是来自服务器的时区)。
问题是当一个没有时区的 XML DateTime 被解析成一个 DateTimeOffset 时,它默认使用本地(系统)时区。似乎无法覆盖默认时区,也无法识别时区是在内部解析还是添加。
有什么方法可以指定 DateTimeOffset 解析使用的默认时区吗?
如果不是,如何识别在解析 DateTimeOffset 时是否自动解析或添加了时区?
我觉得很奇怪,不支持像设置当前文化一样为 .NET 应用程序设置时区。
因此,解决此问题的唯一方法似乎是首先将值解析为 DateTime 并检查 Kind 属性。如果 Kind 不是 Unspecified,则再次将值解析为 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);
}
【问题讨论】:
-
从您的第一个要求:“如果时区信息以 XML 格式提供,请使用此时区。”这意味着“时区”数据是您的代码用于解析 DateTime 对象的输入参数之一,对吧?那么,如果这个参数是未定义的,你不能只使用相同的代码,而是将这个参数分配给你想使用的任何时区作为默认时区吗?
标签: c# timezone timezone-offset datetimeoffset