【问题标题】:Converting String format to Date with ParseExact使用 ParseExact 将字符串格式转换为日期
【发布时间】:2015-09-17 20:35:08
【问题描述】:

我在 vb.net 中遇到了一个奇怪的问题。

通过这种方式,我可以使用 ParseExact、一些日期格式和 CultureInfo 将字符串转换为日期:

   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

得到错误:“字符串未被识别为有效的日期时间”

如你所见,变量f是一个字符串,它的值来自datareader的一行,但仍然是一个字符串。

这怎么可能?

编辑

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

【问题讨论】:

  • 也许试试这个? Dim f As String = CStr(String.Format("{0:dd-MMM-yyy}", dr.Item("fec_estado_insc")).Clone())
  • 得到同样的错误:“字符串未被识别为有效的日期时间”。这很奇怪。如果我直接设置变量 f = "30-mar-2012",则没有错误。但是从 DataReader 填充 f 值时出现错误。
  • 一旦你设置了f的值,它就是一个字符串。字符串是一个字符串,无论它是如何设置或来源的;它不会影响您的下一行。你做错了什么......只需尝试逐行遍历代码并检查变量值。

标签: asp.net vb.net


【解决方案1】:

您确定数据是日期时间吗?如果它为空怎么办?额外检查一下怎么样?

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

【讨论】:

  • 我正在调试并且绝对确定 String.Format("{0:dd-MMM-yyyy}", dr.Item("fec_estado_insc"))) 得到:"30-mar- 2012”。问题是该值何时进入函数 DateTime.ParseExact.
【解决方案2】:

您可以通过将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"))

不幸的是,类型读取器方法只能处理序数索引,但会将值作为日期返回。输出:

realdate 类型:System.DateTime 值:3/30/2012 12:00:00 AM
2012 年 3 月 30 日

如果 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)

输出:

字符串日期日期:2012 年 3 月 30 日
字符串重新解析日期:3/30/2012 12:00:00 AM

如果数据以某种已知的数据格式存在于数据库中,请将其转换/解析为日期然后尝试应用一种格式。在一段代码中,您正在使用 String 进行 DateTime 格式化并作用于 Objectdr.Item 返回对象)。不涉及 Date 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2014-01-18
    • 2019-10-13
    相关资源
    最近更新 更多