【问题标题】:vb.net How do I parse from String to DateTimevb.net 如何从 String 解析到 DateTime
【发布时间】:2019-08-26 08:06:24
【问题描述】:

我在 VB.net 表单上有一个名为 PostDateTxtDatePicker 字段和一个名为 thetimeTime 的文本框。我目前正在从表单中读取值,并将它们存储在变量中,其中fullPostDate 以 dd/mm/yyyy 格式保存字符串日期值,postTime 以 hh:mm 格式保存字符串时间值。它们被存储为字符串,因为这是它们在文本框中的格式,我从中获取它们的值。

当我单击表单上的“更新”按钮时,我正在更新数据库中特定项目的日期和时间值。单击“更新”按钮时调用的函数是:

Protected Sub UpdateButton_Click(sender As Object, e As EventArgs) Handles UpdateButton.Click
    If Page.IsPostBack Then
        ...
        Dim mypostdate As String = HttpUtility.HtmlEncode(PostDateTxt.Text & " " & theTime.Text)
        ...
        'Split the mypostdate variable into separate String variables for date & time
        Dim postDate As DateTime = HttpUtility.HtmlDecode(fullPostDate)
        ...
    ...
End Sub

我现在想将这些值转换回 DateTime 对象,并尝试将字符串解析回 DateTime,如下所示:

Dim postDate As DateTime = HttpUtility.HtmlDecode(fullPostDate

但是,当我单步执行我的代码时,当执行上述行时,我会收到一条 Exception User-Unhandled 消息,上面写着:

System.InvalidCastException: '从字符串 "03/29/3019" 到类型 'Date' 的转换无效'

这是为什么?如何将 String 值转换为 Date 对象?

【问题讨论】:

  • DateTime.TryParse? CDate?您可以使用IsDate 检查传递的字符串是空白还是非日期
  • 冒着头发分裂的风险,您不能将string 转换为DateTime。当一个对象被声明为一种类型但也实现了其他类型(例如通过继承或接口实现)并且您通过这些其他类型之一引用它时,强制转换起作用。 (就像stringobject 一样,您可以将string 转换为object。)string 不是DateTime,因此您可以将其转换为一个。您只能解析或转换它,使用string 中表示的月、日、年等创建新的DateTime
  • 另外,如果您使用的是 VB.NET,请设置Option Strict On。默认情况下,VB.NET 将其关闭。这允许像这样的东西编译,然后当它运行时你会得到错误。在运行应用程序之前,最好在编译器中获取错误。您会发现各种不安全的隐式转换正在发生的地方。它会强制你在它运行之前得到所有类型。
  • 我之前尝试过DateTime.Parse,但这似乎不起作用...我刚刚按照您的建议尝试了DateTime.TryParse,使用:If Date.TryParse(fullPostDate, postDate) Then Console.WriteLine(" Converted '{0}' to {1} ({2}).", fullPostDate, postDate, postDate.Kind) End If,但If 声明在这里等于 False....

标签: vb.net casting


【解决方案1】:

您正在尝试将 String 对象直接转换为 DateTime 对象,这是不可能直接执行的,因为它们不共享允许它们这样做的类层次结构。

您应该尝试将字符串解析为 DateTime 对象,并为解析器提供处理字符串的日期格式。

例如 5/7/19 在英国是 2019 年 7 月 5 日,在美国是 2019 年 5 月 7 日

DateTime.Parse(MyString, MyCultureInfo)

您的 MyCultureInfo 与您希望输入的日期字符串的格式相匹配。 例如

MyCultureInfo = new CultureInfo("en-US")

参考https://docs.microsoft.com/en-us/dotnet/standard/base-types/parsing-datetime

【讨论】:

  • 感谢您的回答。我试了一下:Dim postDate As DateTime 然后DateTime.Parse(fullPostDate, postDate),但是(现在设置了 Option Strict),我在调用Parse()postDate 参数上收到编译错误,说明:“类型的值“日期”无法转换为 IFormatProvider”。我不确定这是为什么?
  • 所以你混淆了你的类型。 DateTime.Parse 的输入参数是类型(String、IFormatProvider)。您正在尝试将 DateTime 用作 IFormatProvider 并且由于 DateTime 未实现接口 IFormatProvider ,因此您无法使用它。您需要文章中使用的 CultureInfo 之类的东西。
【解决方案2】:

尝试使用DateTime.ParseExact。请注意,空格是月份格式字符串和大写字母 MM 的一部分。小写 m 表示分钟。我确信这是一个错字,但 3019 年可能超出范围。 :-)

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim dateString As String = "01/12/2019 05:22" '
    Dim d As DateTime = DateTime.ParseExact(dateString, "dd/MM/yyyy hh:mm", CultureInfo.CurrentCulture)
    Debug.Print(d.ToString)
    'Prints 12/1/2019 5:22:00 AM
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 2011-04-20
    • 2017-04-19
    • 2023-03-09
    • 1970-01-01
    • 2011-05-22
    • 2012-07-22
    相关资源
    最近更新 更多