我有一个ASP MVC应用程序,可以与Linq-To-SQL和MSSQL服务器一起使用。该应用程序是一个内部(仅办公室)网站,我提到,所以当我说我们想要忽略浏览器语言,文化,日期,等等......设置并始终以格式显示日期时,它听起来不会那么奇怪" DD / MM / YYYY&#34 ;.总是。
所以,既然我在网站上测试一个特定的表格,我会遇到非常非常奇怪的事情。
第一件奇怪的事情是日期没有正确显示在屏幕上。让我详细说明一下,我有一个简单的视图,可以在模型中获取从数据库中读取的一些数据。因此,我在教授日期时间对象以某种方式在服务器级别上显示(意味着给它一个像[Display(..)]或[DataType(...)]这样的属性并不强迫看看我想要的日期,所以我只写了以下内容:
<input id="BirthDate" name="BirthDate" type="text" value="<%= Model.BirthDate.HasValue ? Model.BirthDate.Value.ToString("dd/MM/yyyy") : "" %>" class="text-box datepicker" />
然而,即使我专门格式化日期显示&#34; dd / MM / yyyy&#34;在输入中,它没有。当浏览器设置为荷兰语时,此框内的值将显示为&#39; dd-MM-yyyy&#39;。
我可以接受这一点,浏览器是一个聪明人(或gal),并确定框中的值是日期,并根据所选语言设置应用格式。我不知道如何告诉它不要搞砸我的日期,但我可以相信这就是发生的事情。但是,我发现很难接受的是,日期格式以某种方式返回到数据库。这个意思并没有真正意义,所以我再次解释。我有一个包含几列的表,其中一列是varchar(100)。超级,并且由于一些非常有趣的设计,该字段可以包含文本,日期等等。 所以,因为该字段是一个字符串,后来我只是将它显示在一个段落中,并且不需要完成将它投射到DateTime对象的整个舞蹈,然后在它进入视图时将其格式化(它工作得非常完美正如我之前提到的那样)我只是以正确的格式(dd / MM / yyyy)将其保存在表格中。 是的,但不是真的。我的代码看起来像这样:
var date = DateTime.Now;
db.EmployeeHistory log = new EmployeeHistory();
log.ActionType = 1;
log.EmployeeId = 1671;
log.At = date;
log.Context = "A TEST";
log.ObjectTitle = "Who cares";
log.EmployeeHistoryChangesSets.Add(new EmployeeHistoryChangesSet()
{ PropertyName = "TEST PROPERTY", NewValue = date.ToString("dd/MM/yyyy"), OldValue = date.ToString() });
dataContext.EmployeeHistories.InsertOnSubmit(log);
dataContext.SubmitChanges();
这当然是一个考验,一个根本没让我开心的考试。因为,如果你正在注意,数据库中有一个字段映射到一个字符串(varchar(...)),然后我拿着Date,在格式化时用.ToString()方法创建一个字符串它变成了&#34; dd / MM / yyyy&#34;格式。所以我没有使用日期(我使用Date对象来获取日期,但我将其转换为字符串)我只使用字符串。
不知何故,由于某种原因,我真正逃避了,字符串/日期以以下格式保存在数据库中:&#39; dd-MM-yyyy&#39;。我真的没想到它会以这种方式表现出来。起初我会接受我的命运,即使我很难接受数据库将自由格式化我的输入,即使它是一个字符串。
因此,进一步的测试向我展示了Date.ToString(&#34; dd / MM / yyyy&#34;)方法实际上返回的日期是&lt; dd-MM-yyyy&#39;,具体取决于浏览器语言设置。这意味着如果我更改我的设置并且它再次正常工作(&#34; dd / MM / yyyy&#34;)。
所以,我的问题是,我错过了什么?为什么.ToString()方法没有正确格式化日期?我的分析是正确的还是我在这个上面和右边?如果有充分的理由(即使我不能提出),我应该为DateTime类创建自己的扩展方法并实现格式化mannualy还是有更好的方法?
我很遗憾这篇长篇文章(再次)。我很欣赏一些清晰度,因为整个项目都会采用这种方式。提前致谢