【问题标题】:Parsing unknown date fromat from String从字符串解析未知日期格式
【发布时间】:2021-03-10 21:53:06
【问题描述】:

有没有办法在 Visual Basic 中以编程方式查找字符串的日期/时间格式?

我的例子来自工作。我正在使用自定义网页来比较 Excel 电子表格上的表格。我对每张表上记录的比较是基于社会保障和出生日期的最后四位数字,但是目前两个电子表格上的出生日期格式必须相同才能正常运行。用户想在我们更新此项目的报告之前尽早进行比较,我告诉她在她运行网页之前确保生日列的日期时间格式相同。她没有。

我有两个选择,对电子表格中当前存在的日期时间格式进行硬编码,或者找到一种方法使格式无关紧要。我认为后者会更有趣。

我知道有一个 Date.ParseExact 方法,但这要求您已经知道字符串的格式。

为了让您更好地了解我想做什么:

Dim Birthday1 As String = "04/15/1998 13:00:00"
Dim Birthday2 As String = "04/15/1998 1:00 PM"

'//Converts to Date in format "M/d/yyyy"
Dim dateBirthday1 As Date = ConvertFromAnyDateFormat(Birthday1)
Dim dateBirthday2 As Date = ConvertFromAnyDateFormat(Birthday2)

If dateBirthday1 = dateBirthday2 Then
     '//Do comparison operations or whatever
End If

【问题讨论】:

  • 还有比这两种格式更多的吗?
  • 在这两种情况下都是en-US 格式,因此您可以使用DateTime.TryParse(),将CultureInfo.InvariantCulture 作为IFormatProvider 传递。如果日期始终采用该格式,即(月份在日期之前,或者像 1998-04-15 13:00:001998-04-15T13:00:001998-04-15T13:00:00+00:00 等)。

标签: asp.net vb.net


【解决方案1】:

在您的情况下,字符串格式良好。所以只允许系统转换值

这将适用于您的两个日期。

Imports System.Globalization

Public Class MyFunExample
    
   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

      Dim Birthday1 As String = "04/15/1998 13:00:00"
      Dim Birthday2 As String = "04/15/1998 1:00 PM"
      Dim Birthday3 As String = "04/15/98 1:00 PM"
      Dim Birthday4 As String = "04/15/98"

      '//Converts to Date in format "M/d/yyyy"


      Dim dtBir1 As DateTime = Birthday1
      Dim dtBir2 As DateTime = Birthday2
      Dim dtBir3 As DateTime = MyDateCheck(Birthday3)
      Dim dtBir4 As DateTime = MyDateCheck(Birthday4)

      Debug.Print(dtBir1)
      Debug.Print(dtBir2)
      Debug.Print(dtBir3)
      Debug.Print(dtBir4)

     if dtBir1 = dtBir2 then
     End if

End Sub

Function MyDateCheck(sDate As String) As DateTime

    If IsDate(sDate) Then
        Return sDate
    End If

    Dim rFoundOne As DateTime
    ' if we get here, then lets try some other formats
    If DateTime.TryParse(sDate, CultureInfo.InvariantCulture, DateTimeStyles.AllowInnerWhite, rFoundOne) Then
        Return rFoundOne
    End If

    ' try additonal messy cases

    If DateTime.TryParseExact(sDate, "mm dd yy", CultureInfo.InvariantCulture, DateTimeStyles.AllowInnerWhite, rFoundOne) Then
        Return rFoundOne
    End If

    ' if all fail, then we return a "0" date
    Return DateTime.MinValue

End Function

Output:

1998-04-15 1:00:00 PM
1998-04-15 1:00:00 PM
1998-04-15 1:00:00 PM
1998-04-15

因此,如果事情搞砸了 - 那么您可以引入日期检查例程,但在您的情况下,您只需将字符串推入日期时间,因此它们被视为不是字符串,而是内部日期格式编号,因此比较将起作用。

【讨论】:

  • 所以你的意思是只要字符串是有效的 DateTime 格式,你就可以直接将字符串转换为 DateTime?
  • 是的——效果很好。如果它看起来像一个有效的日期字符串 - 它可能会起作用。一旦您有了内部时间格式,那么日期范围、日期/时间之前或日期时间之后等内容将按内部数字排序 - 而不考虑外部字符串格式。当然,一旦采用内部格式,然后比较 = 等是可能的。从 SQL server 到 ms-access 的大多数数据库都有内部格式,它们的工作原理正是您发布问题的原因。因此,请始终在内部格式和外部字符串之间保持思考过程以进行显示。
  • 太棒了!感谢您的帮助@Albert!如果我对该主题有任何进一步的问题,我会确保发表评论,但我认为这已经结束了!
猜你喜欢
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 2022-11-17
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多