SQL Server中FOR JSON AUTO转换datetimeoffset格式问题及C#还原方案
我来帮你解决这个问题,SQL Server的FOR JSON AUTO确实会自动把datetimeoffset类型转换成ISO 8601标准格式(带T分隔符和Z时区标识),不过我们可以从SQL端或者C#端两种途径来处理你的需求:
一、在SQL端保留原格式输出
要避免JSON自动转换datetimeoffset的格式,最直接的办法是把该字段先转换成字符串类型再返回,这样JSON就不会对其进行格式转换了。你可以用CAST或者CONVERT函数来实现:
SELECT CAST(LastUpdateTimestamp AS VARCHAR(50)) AS LastUpdateTimestamp FROM [table] WHERE id = 1 FOR JSON AUTO
这样返回的JSON结果就会保留原始的2017-06-21 08:12:16.1430000 +00:00格式。这里VARCHAR(50)的长度足够容纳datetimeoffset的完整字符串表示,不用担心截断问题。
二、在C#端还原原格式
如果没法修改SQL查询语句,需要在C#中把ISO 8601格式的字符串还原成原始格式,也很简单:
1. 单个值的转换
拿到JSON中的字符串后,直接用DateTimeOffset.Parse解析,再通过ToString指定原始格式即可:
// 假设从JSON中取出的时间字符串 string jsonTime = "2017-06-21T08:12:16.1430000Z"; DateTimeOffset dateTimeOffset = DateTimeOffset.Parse(jsonTime); // 转换为原始格式 string originalFormatTime = dateTimeOffset.ToString("yyyy-MM-dd HH:mm:ss.fffffff zzz"); // 输出结果:2017-06-21 08:12:16.1430000 +00:00
2. 动态场景下的批量处理
如果你涉及大量动态操作(比如不确定哪些字段是datetimeoffset类型),可以用JSON序列化库的自定义转换器来自动处理。以Newtonsoft.Json为例:
首先定义一个自定义转换器:
public class DateTimeOffsetOriginalFormatConverter : JsonConverter<DateTimeOffset> { public override DateTimeOffset ReadJson(JsonReader reader, Type objectType, DateTimeOffset existingValue, bool hasExistingValue, JsonSerializer serializer) { // 解析ISO 8601格式的字符串为DateTimeOffset return DateTimeOffset.Parse(reader.Value.ToString()); } public override void WriteJson(JsonWriter writer, DateTimeOffset value, JsonSerializer serializer) { // 输出为原始格式 writer.WriteValue(value.ToString("yyyy-MM-dd HH:mm:ss.fffffff zzz")); } }
然后在序列化/反序列化时使用这个转换器:
// 反序列化示例 var result = JsonConvert.DeserializeObject<YourDynamicType>(jsonString, new DateTimeOffsetOriginalFormatConverter()); // 序列化示例 var json = JsonConvert.SerializeObject(yourObject, new DateTimeOffsetOriginalFormatConverter());
这样不管是动态解析还是序列化,都能自动处理datetimeoffset的格式转换,不需要依赖固定字段。
内容的提问来源于stack exchange,提问作者user1552172
相关产品推荐
相关产品推荐

