如何确保Bootstrap Timepicker输入时间在API转换后保持不变?
解决Angular UI Bootstrap Timepicker时间与后端存储不一致的问题
问题原因
Angular UI Bootstrap Timepicker返回的Date对象会被序列化为带本地时区偏移的字符串(如Mon Jan 01 0001 17:00:02 GMT-0456 (Eastern Standard Time)),C#在解析该字符串时,会自动根据时区偏移将时间转换为服务器时区或UTC时间,导致存储的时间与用户输入的本地时间不一致。
解决方案
前端处理(推荐优先)
从源头避免时区信息干扰,传递与用户输入完全一致的时间格式:
传递时分秒数值而非完整日期字符串
直接提取Timepicker选中时间的小时、分钟、秒,作为独立参数传递给后端:// 假设timepicker绑定的变量为selectedTime: Date const timeData = { hour: this.selectedTime.getHours(), minute: this.selectedTime.getMinutes(), second: this.selectedTime.getSeconds() }; // 将timeData通过API传递给后端后端接收后,可将这些数值赋值到目标DateTime对象的对应字段,无需处理时区转换。
构造不带时区的ISO格式字符串
手动格式化Date对象为不含时区偏移的ISO字符串,确保后端解析时直接使用本地时间值:function pad(num: number): string { return num.toString().padStart(2, '0'); } const formattedTime = `${this.selectedTime.getFullYear()}-${pad(this.selectedTime.getMonth() + 1)}-${pad(this.selectedTime.getDate())}T${pad(this.selectedTime.getHours())}:${pad(this.selectedTime.getMinutes())}:${pad(this.selectedTime.getSeconds())}`; // 传递formattedTime给后端该格式为
yyyy-MM-ddTHH:mm:ss,C#解析时会默认将其视为无时区信息的时间,不会做偏移转换。
后端处理(前端无法修改时使用)
在C#解析阶段忽略时区偏移,保留原始时间值:
指定解析时忽略时区信息
使用DateTime.ParseExact配合DateTimeStyles.None解析字符串,强制不进行时区转换:string timeString = "Mon Jan 01 0001 17:00:02 GMT-0456 (Eastern Standard Time)"; DateTime parsedTime = DateTime.ParseExact( timeString, "ddd MMM dd yyyy HH:mm:ss 'GMT'zzz '(Eastern Standard Time)'", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None ); // parsedTime此时为用户输入的17:00:02,Kind为Unspecified,保存到数据库时不会被转换使用DateTimeOffset接收并提取本地时间
若需要保留时区信息但存储用户输入的本地时间,可先接收为DateTimeOffset,再提取LocalDateTime:DateTimeOffset timeOffset = DateTimeOffset.Parse(timeString); DateTime localTime = timeOffset.LocalDateTime; // localTime即为用户输入的本地时间,直接保存即可
内容的提问来源于stack exchange,提问作者Matt Perejda
相关产品推荐
相关产品推荐

