如下创建自定义类型转换器:
public class DateTimeOffsetConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(DateTimeOffset))
return true;
return base.CanConvertTo(context, destinationType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var s = value as string;
if (s != null)
{
if (s.EndsWith("Z", StringComparison.OrdinalIgnoreCase))
{
s = s.Substring(0, s.Length - 1) + "+0000";
}
DateTimeOffset result;
if (DateTimeOffset.TryParseExact(s, "yyyyMMdd'T'HHmmss.FFFFFFFzzz", CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
{
return result;
}
}
return base.ConvertFrom(context, culture, value);
}
在你的启动序列中,比如WebApiConfig.Register,动态添加这个类型转换器到DateTimeOffset结构中:
TypeDescriptor.AddAttributes(typeof(DateTimeOffset),
new TypeConverterAttribute(typeof(DateTimeOffsetConverter)));
您现在可以只以 ISO8601 的紧凑形式传递 DateTimeOffset 值,它会省略干扰 URL 的连字符和冒号:
api/values/20171231T012345-0530
api/values/20171231T012345+0000
api/values/20171231T012345Z
请注意,如果您有小数秒,您可能需要include a trailing slash in the url。
api/values/20171231T012345.1234567-0530/
如果你愿意,你也可以把它放在查询字符串中:
api/values?foo=20171231T012345-0530