2025-01-22 乐帮网
c#
使用C#序列化Model成json字符串后进行传输,接受到字符串时也需要把字符串反序列成为对象,其中日期类型是比较常见的一种类型,在Web项目中一般固定一种日期格式例如:yyyy-MM-dd HH:mm:ss。但是也有一些例外的情况,项目中字符串格式可能不统一,就需要我们反序列化时注意。例如我们使用System.Text.Json或者Newtonsoft.Json。设定日期格式如下方式:
public class LseDateTimeConverter : JsonConverter<DateTime>
{
private const string _formatDate = "yyyy-MM-dd HH:mm:ss";
private const string _formatISODate = "yyyy-MM-ddTHH:mm:ss.000Z";
public LseDateTimeConverter()
{
}
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
string? dataStr = reader.GetString();
if(string.IsNullOrEmpty(dataStr))
return Convert.ToDateTime("1970-1-1");
if (dataStr.EndsWith("Z"))
return DateTime.ParseExact(dataStr, _formatISODate, CultureInfo.InvariantCulture);
else
return DateTime.ParseExact(dataStr, _formatDate, CultureInfo.InvariantCulture);
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString(_formatDate, CultureInfo.InvariantCulture));
}
}
发现日期转换过程使用的是 DateTime.ParseExact 并且指定了日期格式,但是有一个问题,随着格式变多,难以控制,于是进行魔改如下:
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
string? dataStr = reader.GetString();
if (string.IsNullOrEmpty(dataStr))
return _dateTimeUtc1970;
DateTime date = DateTime.Now;
if (DateTime.TryParse(dataStr, out date))
return date;
return _dateTimeUtc1970;
}
可正常工作,于是测试DateTime.TryParse的可支持的常见格式如下代码:
[Test]
public void ConvertTest()
{
string[] dateString = new string[]
{
@"09/16/2019 12:00:00 AM",
@"2022-01-01T13:45:30.750-07:00",
@"2021-05-31T09:00:00Z",
@"2024-03-01T17:06:33+08:00",
@"2024-03-01T09:06:33.435430Z",
@"2024-03-01T17:06:33.435+08:00",
@"2024-03-01 17:06:33",
};
IList<DateTime> dates = new List<DateTime>();
foreach (var s in dateString)
{
DateTime date = DateTime.Now;
if(DateTime.TryParse(s, out date))
{
dates.Add(date);
}
}
Assert.AreEqual(dates.Count, dateString.Length);
}
都能正常转换。
关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力