C# 字符串转日期类型的格式指定,为什么不用ParseExact

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

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力