使用ParseExact将String格式转换为Date

时间:2015-09-16 22:18:06

标签: asp.net vb.net

我在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错误?

2 个答案:

答案 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类型。