1

我对 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 日期时间列中,因此显然它需要从英国转换为美国/日期时间格式。我一直试图用 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

应该包含的是日期时间:3/29/2013 4:30PM

真正奇怪的是,如果我在 usDate 上监视并启动应用程序,在开发环境中,它的值显示为#3/29/2013 4:30PM#,无论是在监视列表中还是在源窗口中悬停时,但任何形式的输出都会显示原始字符串,只是减去秒的小数部分,并且不会转换为日期时间。

从我读到的'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()

'

4

3 回答 3

2

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

29/03/2013 16:30:00.000

29/03/2013 16:30:00

3/29/2013 4:00PM

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


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

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

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

尝试将其与您的 SQL 字符串一起使用:

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

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

于 2013-03-21T11:57:27.073 回答
2

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

你说

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

这不是真的。事实上,当您调用 ToString() 时,您可以控制它的输出方式,其中可以指定格式

于 2013-03-21T12:00:08.567 回答
1

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

于 2013-03-21T12:04:00.490 回答