FullCalendar选择事件的本地化开始时间在.NET 9 MVC中解析失败,求解决方法
FullCalendar选择事件的本地化开始时间在.NET 9 MVC中解析失败,求解决方法
遇到这种本地化时间解析的坑确实头疼,我给你两个可行的解决思路,优先推荐第一种,省心又可靠:
方法一:让FullCalendar输出通用的ISO8601标准时间格式
这是最稳妥的方案,因为ISO8601是跨语言、跨时区的通用时间格式,完全避开本地化解析的问题。
FullCalendar返回的selectionInfo.start本质是一个JavaScript的Date对象,我们可以直接调用它的toISOString()方法,生成标准的UTC时间字符串(比如2024-12-30T07:30:00.000Z),然后再赋值给隐藏输入框:
document.addEventListener('DOMContentLoaded', function() { const calOpts = { locale: 'ee', slotDuration: '00:15:00', slotLabelInterval: '00:15', allDaySlot: false, selectConstraint: 'businessHours', select : function( selectionInfo ) { // 修改这里,调用toISOString()获取标准格式 document.getElementById('start').value = selectionInfo.start.toISOString(); }, selectable: true, events: { url: 'api/fullcalendar' } } const calendarEl = document.getElementById('calendar') calendar = new FullCalendar.Calendar(calendarEl, calOpts) calendar.render() })
对应的.NET控制器代码可以简化,不用指定文化就能直接解析:
[HttpPost] public async Task<IActionResult> Kinnitatud(string start) { // ISO格式无需指定文化,直接解析并转UTC DateTime algus = DateTimeOffset.Parse(start).UtcDateTime; // 后续业务逻辑... }
方法二:自定义格式让.NET解析本地化时间字符串
如果一定要保留FullCalendar返回的本地化格式,那需要针对返回的字符串格式做自定义解析。问题出在返回的字符串包含了带括号的时区描述(比如(Ida-Euroopa standardaeg)),.NET默认的解析规则不识别这种格式,所以需要手动指定匹配的格式字符串:
using System.Globalization; [HttpPost] public async Task<IActionResult> Kinnitatud(string start) { // 定义匹配的格式,注意用单引号固定非可变部分(比如GMT),括号里的时区名称用zzzz匹配 string timeFormat = "ddd MMM dd yyyy HH:mm:ss 'GMT'zzz (zzzz)"; // 因为月份、星期是英文缩写(Mon、Dec),所以用InvariantCulture解析 DateTime algus = DateTime.ParseExact(start, timeFormat, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal); // 后续业务逻辑... }
不过这个方法有个局限性:不同浏览器返回的时区描述可能有差异,比如有些浏览器可能不会带括号里的内容,或者格式略有不同,稳定性不如第一种方法。
备注:内容来源于stack exchange,提问作者Andrus
相关产品推荐
相关产品推荐

