如何将Umbraco Lucene的updateDate值转换为.NET DateTime对象?
解决方法
这个数值638502404046200000是.NET DateTime.Ticks 值(以100纳秒为单位,从0001年1月1日开始计算)。你得到0001年1月1日的原因大概率是字符串转long失败(比如字段值为空、格式错误),导致代码返回了DateTime.MinValue。
正确转换步骤
- 从
LuceneSearchResult中获取updateDate字段的字符串值 - 安全将字符串转换为
long类型,避免转换失败的情况 - 用转换后的
long值初始化DateTime对象 - 根据需求格式化展示,比如转为本地时间、指定显示格式
示例代码
// 从搜索结果中提取updateDate字段值 var updateDateStr = searchResult.Fields["updateDate"]; // 安全转换为long类型 if (long.TryParse(updateDateStr, out long ticks)) { // Umbraco通常存储UTC时间,需指定DateTimeKind避免时区偏移错误 var updateDate = new DateTime(ticks, DateTimeKind.Utc); // 转为本地时间(根据业务需求选择是否需要) var localUpdateDate = updateDate.ToLocalTime(); // 格式化输出,比如"yyyy-MM-dd HH:mm:ss" var displayDate = localUpdateDate.ToString("yyyy-MM-dd HH:mm:ss"); } else { // 处理转换失败的场景,比如显示默认文本 var displayDate = "未知时间"; }
关键注意事项
- 时区处理:Umbraco在Examine中存储的时间一般是UTC,转换时指定
DateTimeKind.Utc可以避免本地时区偏移导致的时间错误。 - 异常防护:必须使用
long.TryParse而非直接long.Parse,防止字段值异常时触发崩溃,进而返回DateTime.MinValue(即0001年1月1日)。
之前转换失败的原因
如果你的代码是直接将字符串转为DateTime(比如DateTime.Parse(updateDateStr)),或者转换long时未做异常处理,一旦转换失败就会返回DateTime.MinValue,也就是你看到的0001年1月1日。
内容的提问来源于stack exchange,提问作者CDrnly
相关产品推荐
相关产品推荐

