項目需求原因需要把Webapi中的Datetime 序列化及反序列化時間戳(long),遇到相同問題的同學可作參考。 1.聲明一個時間戳轉換器 2.配置使用時間戳轉換器(到這一步API就能序列化和反序列化時間戳了) 3.因為項目中使用了Swagger UI自動生成WebApi文檔如果想介面文檔Dat ...
項目需求原因需要把Webapi中的Datetime 序列化及反序列化時間戳(long),遇到相同問題的同學可作參考。
1.聲明一個時間戳轉換器
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就能序列化和反序列化時間戳了)
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?的映射和預設值
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文檔顯示如下