asp.net webapi Datetime 序列化\反序列化爲時間戳

項目需求緣由須要把Webapi中的Datetime 序列化及反序列化時間戳(long),遇到相同問題的同窗可做參考。api

 

1.聲明一個時間戳轉換器ide

 1     public class UnixDateTimeConvertor : DateTimeConverterBase
 2     {
 3 
 4         public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
 5         {
 6             long jsTimeStamp = long.Parse(reader.Value.ToString());
 7             System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
 8             DateTime dt = startTime.AddMilliseconds(jsTimeStamp);
 9             return dt;
10         }
11 
12         public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
13         {
14             System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); 
15             long timeStamp = (long)(((DateTime)value) - startTime).TotalMilliseconds; 
16             writer.WriteValue(timeStamp);
17         }
18     }

 

2.配置使用時間戳轉換器(到這一步API就能序列化和反序列化時間戳了)spa

 1     public static class WebApiConfig
 2     {
 3         public static void Register(HttpConfiguration config)
 4         {
 5             //啓用標記路由功能
 6             config.MapHttpAttributeRoutes();
 7 
 8             config.Routes.MapHttpRoute(
 9                 name: "DefaultApi",
10                 routeTemplate: "api/{controller}/{id}",
11                 defaults: new { id = RouteParameter.Optional }
12             );
13 
15             //設置Datetime 到 時間戳 的互轉 
16             JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings()
17             {
18                 Formatting = Formatting.Indented,
19                 DateTimeZoneHandling = DateTimeZoneHandling.Local
20             };
21             jSettings.Converters.Add(new UnixDateTimeConvertor());
22             config.Formatters.JsonFormatter.SerializerSettings = jSettings;
23 
24         }
25     }

 

3.由於項目中使用了Swagger UI自動生成WebApi文檔若是想接口文檔Datetime顯示的Example是時間戳能夠如如下設置,在你本身的SwaggerConfig設置中添加Datetime及Datetime?的映射和默認值code

 1             config
 2                 .EnableSwagger(c =>
 3                     {
 4             //...省略無關代碼
 5 
 6                         System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); 
 7                         long exampleVal = (long)(DateTime.Now - startTime).TotalMilliseconds; 
 8                         Schema timeSchema = new Schema { type = "number", format = "long", example = exampleVal };
 9 
10                         c.MapType<DateTime?>(() => timeSchema);
11                         c.MapType<DateTime>(() => timeSchema);
12 
13                     });

最終生成的Webapi文檔顯示以下orm

相關文章
相關標籤/搜索