为什么Adaptive Card的Input.Date控件选中日期后会自动减1天?

问题根因
该问题由Teams客户端和后台的时区转换逻辑不匹配导致:
- Teams原生客户端在提交
Input.Date控件的选中值时,会自动将用户选择的本地日期转换为UTC时区的0点时间戳传回后台 - 如果你所处的时区为UTC+X(例如中国标准时间为UTC+8),UTC零点对应的本地日期刚好是前一天,后台如果直接反序列化为本地DateTime,就会出现日期少1天的问题
解决方案
方案1:反序列化时统一按UTC处理后再偏移到目标时区
修改你的反序列化逻辑,先以UTC格式读取日期,再转换到你需要的业务时区:
// 配置序列化规则,强制按UTC读取日期 var jsonSettings = new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Utc }; var o = JsonConvert.DeserializeObject<TC>(json, jsonSettings); // 转换为业务所需的时区时间,示例为中国标准时间 var targetZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); o.Date_EndOfLastMonth = TimeZoneInfo.ConvertTimeFromUtc(o.Date_EndOfLastMonth, targetZone).Date; // 其余日期字段按相同逻辑处理即可
方案2:将日期字段设为字符串类型,避免自动时区转换
把实体类TC中的所有日期字段改为string类型,让Newtonsoft.Json不会自动做时区转换,后续业务使用时再手动按格式解析:
// TC实体类定义示例 public class TC { public string Date_EndOfLastMonth { get; set; } public string Date_EndOfLastYear { get; set; } public string ValuationKeyDate { get; set; } // 其余业务字段 } // 需要转换为DateTime时手动解析 var businessDate = DateTime.ParseExact(o.Date_EndOfLastMonth, "yyyy-MM-dd", CultureInfo.InvariantCulture);
方案3:自定义提交逻辑(仅适用自定义嵌入场景)
如果是自己嵌入的自适应卡片渲染器,可以在提交事件中手动把日期转成字符串再提交,该方案不适用Teams原生客户端场景,优先选择前两种方案即可。
内容的提问来源于stack exchange,提问作者Aron Gabor Kelsch
相关产品推荐
相关产品推荐

