Date.Parse / ParseExact没有改变日期的奇怪问题(ASP.Net)

时间:2013-03-21 11:44:22

标签: asp.net sql vb.net parsing date

我对VB中的Date.Parse / ParseExact功能有点嗤之以鼻。 为了推测,我有一个ASP.Net 4.0应用程序,在其中一个页面上有一个日历控件,用户选择一个日期和时间,它们被输入一个字符串(strReqDeadline),它采用以下欧洲/英国日期时间格式:dd / MM / yyyy HH:mm:ss.fff

因此,例如strReqDeadline的内容将是:29/03/2013 16:30:00.000

然后我需要将其插入到SQL datetime列中,因此很明显它需要从UK转换为US / datetime格式。我一直试图用Date.Parse和Date.ParseExact来做这件事但没有成功。以下根据我所做的研究工作

strReqDeadline = "29/03/2013 16:30:00.000"
Dim usDate = As Date = Date.ParseExact(strReqDeadline, "dd/MM/yyyy HH:mm:ss.fff",  System.Globalization.CultureInfo.InvariantCulture)

但是,在运行时实际发生的事情是眩晕,Date.ParseExact函数会从时间上缩短分形秒数(据我所知,不应该这样做因为过滤器指定.fff),否则整个字符串完全不变。 因此,如果输出usDate的值,则显示如下: 29/03/2013 16:30:00

包含的内容是日期时间: 2013年3月29日下午4:30

真奇怪的是,如果我把手表放在usDate并启动应用程序,在开发环境中它的价值显示为#3/29/2013 4:30 PM#,两者都在手表中列表和在源窗口中盘旋时,但任何形式的输出显示原始字符串,只是减去秒的分数,并且不会转换为日期时间。

从我读到的'InvariantCulture'规范应该否定任何特定于语言环境的输出问题,但是如果这是问题我还尝试用System.Globalization.CultureInfo.CreateSpecificCulture(“en-GB”指定一个显式的本地文化“)(也试过fr-FR),但这没什么区别。如果这与任何相关性,则客户端和服务器上的Windows区域设置都将设置为UK。

也许我错过了一些非常明显的东西,但我只是看不出为什么我得到这个输出,Date.ParseExact没有抛出任何异常或抱怨字符串无法被识别,但我很难理解为什么它只是删除小数秒而不做任何其他事情,特别是因为输入弹簧与指定的掩码完全匹配。

我很想知道是否有其他人遇到过像这样的奇怪问题以及你用它做了什么!

谢谢:)

编辑:SQL部分的完整代码如下:

strReqDeadline = "29/03/2013 16:30:00.000"    
Dim usDate As Date = Date.ParseExact(strReqDeadline, "dd/MM/yyyy HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)

'SQL
Dim con As New Data.SqlClient.SqlConnection("data source=XXXXX;initial catalog=YYYYY;Integrated Security=True")
Dim cmd As New Data.SqlClient.SqlCommand()

cmd.Connection = con

cmd.CommandText = "INSERT INTO Requests (ReqOwnerID, ReqDeadline, ReqStatus)" _
& "VALUES ('" & UserID & "', '" & usDate & "', '1')"

con.Open()
Dim NewReqID = cmd.ExecuteScalar()

con.Close()

3 个答案:

答案 0 :(得分:2)

为什么你瘦了它不工作?这些全部是相同的基础日期/时间:

29/03/2013 16:30:00.000

29/03/2013 16:30:00

3/29/2013 4:00PM

您不能依赖悬停在非字符串变量上的内容来确定其内部值。您所看到的只是ToString()的评估。如果您希望String显示分数秒,则需要调用ToString()并指定格式“dd / MM / yyyy HH:mm:ss.fff”。默认情况下为DateTime类型,如果在转换为String时不显示分数秒。


如果您没有使用参数(并且您应该使用),那么在注入DateTime之后您的最终SQL语句将是这样的:

INSERT INTO MyTableWithDate
   (column1
   ,column2
   ,MyDateCol)
VALUES 
   ('a'
   ,'b'
   ,'20130329 16:30:00.557')

正如我之前提到的,Date数据类型不是String。它是一个对象(或者更像是一个DateTime结构,我离题了)。您必须调用正确的ToString() meth0d。

尝试使用SQL字符串:

& "VALUES ('" & UserID & "', '" & usDate.ToString("yyyyMMdd HH:mm:ss.fff") & "', '1')"

当然,将字符串转换为Date对象以便立即将其再次转换回字符串几乎没有意义,但此代码应该可以正常工作。

答案 1 :(得分:2)

usDate是DateTime类型的对象,它似乎存储了正确的值。在检查它时,您将看到该日期时间值的字符串表示形式。它不包含29/03/2013 16:30:00或2013年3月29日下午4:30,这些只是它包含的两个有效表示。

你说

  

任何形式的输出都会显示原始字符串

事实并非如此。实际上,当您调用可以指定格式的ToString()时,您可以控制它的输出方式

答案 2 :(得分:1)

您正在做的事情看起来是正确的,即使用Date.ParseExact将英国格式的日期转换为日期类型。您遇到的问题是,当它将其显示为字符串时,它会在您的本地文化中显示它(调试器似乎总是希望以美国格式显示),但您设置的日期是正确的。