DateTime解析FormatException:咨询Ticks格式的解析方案
问题解答
核心结论
DateTime.ParseExact 仅支持解析符合特定日期格式的字符串,而Ticks(计时周期)本质是64位整数,无法通过格式字符串直接解析。你需要通过数值转换+专用API的方式处理这种格式。
具体实现方案
- 先将Ticks字符串转换为
long类型 - 使用
DateTime.FromTicks()方法将其转换为DateTime对象
修改后的代码示例
items = (await itemService.GetItems()) .GroupBy(x => x.ItemKey) .Select(x => { var dateValue = x.FirstOrDefault(y => y.item == "Date")?.Value; DateTime? parsedDate = null; if (!string.IsNullOrEmpty(dateValue)) { // 优先尝试解析Ticks格式 if (long.TryParse(dateValue, out long ticks)) { parsedDate = DateTime.FromTicks(ticks); } // 再尝试原有两种日期格式 else { try { parsedDate = DateTime.ParseExact(dateValue, new string[] { "yyyy-MM-dd HH:mm:ss.FFFFFFF", "dd.MM.yyyy HH:mm:ss" }, null, DateTimeStyles.AssumeLocal); } catch (FormatException) { // 解析失败时保持null即可 } } } return new DisplayItem { item = x.item, country = x.FirstOrDefault(y => y.item == "Country")?.Value, date = parsedDate }; }) .Where(s => s.country != null) .OrderByDescending(s => s.date) .ToList();
补充提示
- .NET中
DateTime.FromTicks()的基准时间是0001年1月1日00:00:00,要确保你收到的Ticks值基于这个基准,否则会得到错误日期。 - 使用
long.TryParse()替代直接转换,能避免转换失败抛出异常,提升代码健壮性。
内容的提问来源于stack exchange,提问作者Tar270
相关产品推荐
相关产品推荐

