我正在使用自定义重载的SaveChanges来实现一些审核功能。除了与日期相关的一些意外行为外,该功能完美运行。在此示例中,我将日期字段值从2014年5月1日更改为2014年5月2日:
此处对数据库进行了更改:
Public Function UpdateTask(request As DataSourceRequest, ThisTask As JobTasksVM) As JsonResult
Dim cu As ApplicationUser = GetCurrentUser()
Dim CurrentTask = db.events.Find(ThisTask.id)
CurrentTask.start_date = ThisTask.start '<--- 2/5/2014 (ie 2nd May 2014), was previously 1/5/2014
CurrentTask.date = ThisTask.end
CurrentTask.task_name = ThisTask.Title
db.SaveChanges(cu.Employee_id)
End Function
我的自定义SaveChanges拦截了这个:
Public Overloads Function SaveChanges(userID As Integer) As Integer
For Each entry As dbentityentry In Me.ChangeTracker.Entries().Where(Function(e) e.State <> EntityState.Unchanged)
Dim startOriginal As DateTime = entry.OriginalValues.Item("start_date")
Dim StartCurrent As DateTime = entry.CurrentValues.Item("start_date")
etc....
奇怪的是,虽然提交的CurrentTask.start_date明确显示2014年2月5日(2014年5月2日)的正确(英国)日期,但重载的SaveChanges中的值为:
startOriginal:2014年1月5日(即2014年1月5日)&lt; - 似乎已改为美国文化
startCurrent:2/5/2014(即2014年5月2日)&lt; ---按预期
我需要在审核功能中使用原始值,因此这会导致问题。我也尝试过:
entry.CurrentValues.SetValues(entry.GetDatabaseValues)
但是这也会将错误的(即美国格式5/1/2014)加载到start_date字段中。
我检查了系统上的所有文化设置,它们都是正确的英国 - 英国。这种行为似乎根本不一致 - 我错过了什么?! 感谢
答案 0 :(得分:1)
DateTime
类型没有格式,它们只是一个值(自1/1/0001以来的滴答数)。
您没有说明您在哪里看到“错误”格式,无论是ToString()
输出还是智能感知。如果您使用ToString
到“输出”窗口,您应该会看到英国格式,因为ToString
将使用/尊重计算机的本地文化设置。
Intellisense与文化无关,并尝试使用明确的格式:MM/dd/yyyy
。这与从文字创建DateTime
var时必须使用的“格式”或顺序相同:
Dim dt As DateTime = #1/5/2014# ' e.g. MM/dd/yyyy
' same as:
Dim dt As New DateTime(1, 5, 2014) ' mm, dd, yyyy
这是InvariantCulture
(不是美国)。将鼠标悬停在var上时,VB IDE将使用相同的顺序。它试图通过显示与哈希值#1/5/2014#
来明确它使用所需的文字/ InvariantCulture格式。
Dim dt As DateTime = #2/11/2011#
Console.WriteLine(dt.ToString)
在美国,2/11/2011
将根据文化显示
在英国,它将是11/2/2011
Intellisense将是#2/11/2011#