我们将 XML DateTime 值解析为 DateTimeOffset 值。根据DateTime 的 W3C XSD 文档 http://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/datatypes.html#dateTime,该类型可能有或没有时区信息。
我们的要求是:
- 如果 XML 中提供了时区信息,请使用此时区
- 如果未提供时区信息,则假定它是预定义的可配置时区(而不是来自服务器的时区)的本地时间。
问题是,当没有时区的 XML DateTime 被解析为 DateTimeOffset 时,它默认使用本地(系统)时区。似乎无法覆盖默认时区,也无法识别时区是在内部解析还是添加的。
有什么方法可以指定 DateTimeOffset 解析使用的默认时区吗?
如果不是,如何确定在解析 DateTimeOffset 期间是否自动解析或添加了时区?
我觉得奇怪的是,不支持像设置当前区域性那样为 .NET 应用程序设置时区。
因此,解决此问题的唯一方法似乎是首先将值解析为 DateTime 并检查 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);
}
最简单的方法是提前测试字符串以查看它是否包含偏移量。正则表达式对此很有效。
这是一个适合您描述的情况的函数:
static DateTimeOffset ParseAsDateTimeOffset(string s, TimeSpan defaultOffset)
{
if (Regex.IsMatch(s, @"(Z|[+-]\d{2}:\d{2})$"))
return DateTimeOffset.Parse(s, CultureInfo.InvariantCulture);
var dt = DateTime.Parse(s, CultureInfo.InvariantCulture);
return new DateTimeOffset(dt, defaultOffset);
}
您还可以考虑稍微改变一下,即提供默认值时区,而不是默认值offset。这是一个重要的区别,因为时区的偏移量可能会根据特定日期是否处于夏令时期间而变化。另请参阅“时区!=偏移量”时区标签 wiki https://stackoverflow.com/tags/timezone/info.
static DateTimeOffset ParseAsDateTimeOffset(string s, TimeZoneInfo defaultTimeZone)
{
if (Regex.IsMatch(s, @"(Z|[+-]\d{2}:\d{2})$"))
return DateTimeOffset.Parse(s, CultureInfo.InvariantCulture);
var dt = DateTime.Parse(s, CultureInfo.InvariantCulture);
return new DateTimeOffset(dt, defaultTimeZone.GetUtcOffset(dt));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)