【问题标题】:Date Conversion error in VB6VB6中的日期转换错误
【发布时间】:2011-05-31 06:41:57
【问题描述】:

如果用户以 dd/mm/yyyy 格式输入日期为 2011 年 6 月 1 日 (01/06/2011)

转换后返回“2011 年 1 月 6 日”而不是“2011 年 6 月 1 日”。

让我解释一下它是如何在 2011 年 1 月 1 日转换它的。

User entered = 01/06/2011 (dd/mm/yyyy)   i.e. 1st june 2011
After conversion it returns = 01/06/2011 (mm/dd/yyyy) i.e. 6th jan 2011

记住:用户日期格式在设计时是未知的。它正在从数据库中获取并存储在变量(字符串)中

有没有解决办法。

请仅提供与VB6相关的解决方案,不在.net中

【问题讨论】:

  • 如果不知道用户日期格式,你怎么知道用户的意思是 6 月 1 日而不是 1 月 6 日?
  • 在测试时,我们从数据库中获取用户格式“dd/mm/yyyy”并将其存储在一个变量中。我之所以说在设计时不知道用户格式,只是因为任何专家的任何建议都不应该基于日期格式始终为“dd/mm/yyyy”的假设。它也可能是不同的格式。
  • 你知道格式字符串的结构吗?可以是“yyyy-mm-dd”、“dd/mm/yyyy hh:mm:ss”...?
  • 是的,它不包括时间格式。所以它可能是“dd/mm/yyyy”/“yyyy/dd/mm”或“yyyy/mm/dd”或其他任何东西
  • 那么唯一可靠的解决方案就是将用户输入的字符串解析为令牌并从中构建日期。涉及一些文本处理(例如尝试使用拉脱维亚日期:))另一种方法是强制用户分别输入所有日期部分;您可以根据存储的格式构建 UI。

标签: vb6 date-conversion


【解决方案1】:

您可以通过以下方式查找用户区域日期格式设置:

Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Private Const LOCALE_USER_DEFAULT = &H400
Private Const LOCALE_SSHORTDATE = &H1F ' short date format string
Private Const LOCALE_SLONGDATE = &H20 ' long date format string

Public Function GetUserShortDateFormat() As String
    Dim strLocale As String
    Dim lngRet As Long

    'Get short date format
    strLocale = Space(255)
    lngRet = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, strLocale, Len(strLocale))
    strLocale = Left(strLocale, lngRet - 1)

    GetUserShortDateFormat = strLocale
End Function

但这并不能保证用户确实以这种格式输入它。

如果您将数据库日期列字段中的日期读取到日期变量中,它将采用这种格式。

【讨论】:

    【解决方案2】:

    很好,我已经编写了自己的方法来将日期分解为标记,因为我没有找到解决问题的其他方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多