【发布时间】:2022-01-29 17:09:41
【问题描述】:
所以我有一个 ASP.NET MV5 应用程序,我正在使用 Entity Framework 6 和一个 SQL Server 数据库。我也用这个:datepicker
我有这种格式的 bootstrap-datepicker 输入:'dd.mm.yyyy'。使用 jQuery,我得到了这个字段的值,它与 "29.01.2022" 完全相同,然后我将它发送到一个 ASP.NET MVC 操作方法,该方法需要一个 DateTime 参数。
在我的操作中,该参数自动转换为DateTime 格式,但保留正确的日期。
日期选择器配置:
$(".input-daterange") {
language: 'ro',
format: 'dd.mm.yyyy',// this gives 29.01.2022
//format: 'dd.MM.yyyy',// this gives 29.Jan.2022
autoclose: true,
calendarWeeks: true,
clearbtn: true,
disableTouchKeyboard: true
}
我使用 Entity Framework 6 进行数据库访问,所以我的代码如下所示:
public Action SaveField(int rowId, DateTime fieldDateValue)
{
var itemToUpdate = _context.TableName.Single(i => i.id = rowId); // this is not null
itemToUpdate.StartDate = fieldDateValue;
try
{
_context.SaveChanges()
}
catch
{ ... }
}
这段代码在调试模式下运行良好,但是当我发布应用程序时一切都变得疯狂,我得到一个错误
字符串未被识别为有效的日期时间
到目前为止我尝试过的(因为 datepicker 格式:dd.mm.yyyy):
itemToUpdate.StartDate = fieldDateValue-
itemToUpdate.StartDate = Convert.ToDateTime(fieldDateValue.ToString("yyyy-MM-dd HH:mm:ss"))--> 这工作了几次,但数据库中保存的日期是从29.01.2022到2022-29-01所以类似于yyyy-MM-dd,但也会出错 itemToUpdate.StartDate = DateTime.ParseExact(fieldDateValue.ToString(), "dd.mm.yyyy", CultureInfo.InvariantCulture);itemToUpdate.StartDate = DateTime.ParseExact(fieldDateValue.ToShortDateString(), "dd.mm.yyyy", CultureInfo.InvariantCulture);
考虑到我在远程服务器上运行的应用程序的已发布版本(这可能会解释问题)但也在同一台机器上(IIS wwroot),我根本无法理解我做错了什么。
有人能告诉我如何正确管理日期格式,这样调试和发布版本之间就不会再出现问题和差异了吗?
【问题讨论】:
-
"var itemToUpdate = _context.TableName.Single(i => i.id = rowId);/// this is not null" 你确定这是真的吗?使用 SingleOrDefault 似乎很容易,并且在进行值重新分配和保存更改之前检查 itemToUpdate 是否为空。
-
@AndyStagg 是的,我确定,我不想写太多,但我很肯定它不为空
-
表中的列是
datetime列,因此不会以29.01.2022之类的格式存储。我强烈建议你教你的 jQuery 日期选择器不要愚蠢,并将像yyyyMMdd这样的明确格式传递给数据库。其他任何东西都是不安全的。 -
自己解析日期时,需要 MM(大写)表示月份。小写毫米是分钟
-
@HansKesting 是的,我想我现在明白了,我正在测试一些东西 - 我在其他页面上使用了“dd.mm.yyyy”,它在那里工作,但现在我已经意识到我从选择器中选择的月份变成了 01(Jan)
标签: sql-server asp.net-mvc datetime entity-framework-6 release