我在vb.net中遇到一个奇怪的问题。
通过这种方式,使用ParseExact,一些日期格式和CultureInfo将String转换为Date没有问题:
Dim f As String = "30-mar-2012"
' Value of f is "30/03/2012"
xdate = DateTime.ParseExact(
f,
"dd-MMM-yyyy",
System.Globalization.CultureInfo.InvariantCulture)
使用DataReader时会出现问题
While dr.Read
Dim f As String = String.Format("{0:dd-MMM-yyyy}", dr.Item("fec_estado_insc")))
' Value of f is "30-mar-2012"
xdate = DateTime.ParseExact(
f,
"dd-MMM-yyyy",
System.Globalization.CultureInfo.InvariantCulture)
End While
获取错误:“字符串未被识别为有效的DateTime”
如您所见,变量 f 是一个字符串,其值来自一个datareader的行,但是stil是一个字符串。
这怎么可能?
修改
在Chan的帮助下,我找到了以“dd-MMM-yyyy”格式获取约会的黑客方法。我必须创建这个功能:
Public Shared Function Giveme_Date_dd_MMM_yyyy(ByVal XobjValue As Object) As Nullable(Of Date)
If XobjValue Is System.DBNull.Value Then
Return Nothing
ElseIf XobjValue Is Nothing Then
Return Nothing
ElseIf XobjValue.ToString.Trim.Equals("") Then
Return Nothing
End If
Dim f As String = String.Format("{0:dd-MMM-yyy}", XobjValue)
Dim dtResult As Date, xdate As Date
If DateTime.TryParse(f, dtResult) Then
xdate = CDate(dtResult.ToString("f", System.Globalization.CultureInfo.InvariantCulture))
End If
Return xdate
End Function
在数据库中,必须以这种方式更改SELECT查询:
OPEN r_cursor FOR
SELECT to_char(fec_estado_insc,'dd/mm/yyyy') AS fec_estado_insc,
blah
blah
blah
然而,原始问题仍然存在。一些vb.net错误?
答案 0 :(得分:0)
您确定数据是日期时间吗?如果它为空怎么办?如何追加支票?
Dim f As String = "30-mar-2012"
Dim dtResult As Date, xdate As Date
If DateTime.TryParse(f, dtResult) Then
xdate = dtResult.ToString("f", System.Globalization.CultureInfo.InvariantCulture)
End If
答案 1 :(得分:0)
将Date
存储为Date
,然后将其作为Date
读回来,可以避免整个问题。 Dates
没有格式,它们只是一个值,但您可以使用格式以任何方式显示它们。
ID Name RealDate StringDate
1 Test1 3/30/2012 30-mar-2012
可以通过这种方式将日期作为日期回读:
' "SELECT Name, RealDate, StringDate FROM...
Using rdr = cmd.ExecuteReader()
rdr.Read()
realDate = rdr.GetDateTime(1)
Console.WriteLine("realdate type: {0} value: {1} ", realDate.GetType, realDate)
Console.WriteLine(realDate.ToString("dd-MMM-yyyy"))
不幸的是,类型阅读器方法只能处理序数索引,但会将值作为Date返回。输出:
realdate类型:System.DateTime值:3/30/2012 12:00:00 AM 30-MAR-2012
如果DB col是Date类型,则DB只会在列中接受Date类型。要按列名读取它,您可以解析或只转换:
realDate = Convert.ToDateTime(rdr("realdate").ToString)
当你“必须”从字符串转换时(假设“日期”是“dd-MMM-yyyy”):
stringDate = rdr("stringDate").ToString
Console.WriteLine("String Date date: {0}", stringDate)
Dim newDate = DateTime.ParseExact(stringDate, "dd-MMM-yyyy", CultureInfo.InvariantCulture)
Console.WriteLine("String Date reparsed: {0}", newDate)
输出:
String Date date:30-mar-2012
String desharsed:3/30/2012 12:00:00 AM
如果数据以某种已知数据格式存在于数据库中,请将其转换/解析为日期然后尝试应用格式。在一段代码中,您使用String
进行DateTime
格式化并在Object
上执行操作(dr.Item
返回对象)。没有涉及Date
类型。