日期格式不适用于波兰语连字符

时间:2016-01-27 15:11:37

标签: vb.net visual-studio

我有代码:

tempDate = exWS.Cells(exRow, myMatchedColumns(2)).value

从电子表格中的单元格中获取日期, 然后我有了代码:

dueDate = Format("dd/MM/yyyy", tempDate)

将日期从DD / MM / YYYY更改为正确。

然而,当我的代码运行时,我在波兰语系统上运行我的程序(其区域默认值是YYYY-MM-DD);

临时日期:YYYY-MM-DD

截止日期:DD-MM-YYYY

所以这种格式是正确的,但它并没有改变斜线的破折号。

当然我的SQL需要格式为dd / mm / yyyy。

您能否帮助更好地设置日期格式。

非常感谢

1 个答案:

答案 0 :(得分:1)

这个问题有几个常见的误解。

首先,也许最重要的是,你应该开启Option Strict。您可能会进行一些隐式转换。

tempDate = exWS.Cells(exRow, myMatchedColumns(2)).value

我不知道如何声明tempDate,但我很确定excel单元格值是对象。因此,tempDate充其量只是一个标有Object的日期。

 dueDate = Format("dd/MM/yyyy", tempDate)

那不会&#34;格式化日期&#34;。它DateTime转换为<{1}}为该格式的字符串。

日期没有格式

网络DateTime类型没有格式。您无法应用格式。没有需要来格式化日期。来自MSDN

  

表示即时时间,通常表示为日期和时间   ...   例如,刻度值31241376000000000L表示日期,
  1月1日星期五,01:00 12:00:00午夜。

DateTime只是一个大数字。 。今天的日期是635894496000000000L,DateTime.Now是635894883340193705L。

即使对于Eric Lippert 1 ,显示这些值也没有意义,因此DateTime类型包含代码,以便将其表示为日期和时间&#39; 。它甚至意识到当地文化,所以波兰与英国对意大利的单一日期将有所不同,没有我们的代码或帮助。例如:

Dim myDT = DateTime.Now

Console.WriteLine(myDT.ToString("yyyy-MM-dd"))
Console.WriteLine(myDT.ToString("MM/dd/yyyy"))
Console.WriteLine(myDT.ToString("d-M-yyyy"))
' use culture default:  
Console.WriteLine(myDT.ToString(New CultureInfo("pl-PL")))
Console.WriteLine(myDT.ToString(New CultureInfo("fr-FR")))
  

2016年1月27日
  2016年1月27日
  27-1-2016
  27/01/2016 11:27:13
  2016-01-27 11:27:13

它是完全相同的日期和相同的确切值,但在我想要的任何文化中以任何我想要的格式显示。

Polish hyphens

如上所述,Format()返回一个字符串,而不是日期。但输出是正确的,因为波兰文化不使用斜杠

Dim cult = New CultureInfo("pl-PL")
Dim polishDTDisplayFormat = cult.DateTimeFormat
Console.WriteLine(polishDTDisplayFormat.DateSeparator)
' prints '-'

与美国或英国等可能使用的文化不同,波兰语没有定义斜杠。 Format将为文化定义的合法日期分隔符替换指定的非法字符。 DateTime也会这样做:

' try to override because I think I know better:
Console.WriteLine(myDT.ToString("yyyy/MM/dd", New CultureInfo("pl-PL")))
  

2016-01-27

这是件好事!它阻止我们获得文化的DateSeperator并在代码中编写一个格式字符串。强大的DateTime类型还包括ToShortDateString()等方法,可以轻松地以合法的本地顺序显示日期(&#34; M / d / yyyy&#34; vs&#34; yyyy-M -d&#34;。)

使用此DotNetFiddle检查文化的所有合法格式。

Naturally my SQL needs it in the format dd/mm/yyyy

抱歉,但事实并非如此。

使用(MySql?)NET DB提供程序对象和定义为DateTime列,只需将.NET DateTime变量保存到数据库:< / p>

 Using dbcon = New MySqlConnection(connstr)
        Using cmd As New MySqlCommand(SQL, dbcon)
            dbcon.Open()
            cmd.Parameters.Add("@p1", MySqlDbType.DateTime).Value = myDT
            rows = cmd.ExecuteNonQuery()
        End Using
  End Using   

OleDB / Access和SQL Server也是如此。他们都知道该怎么做。 NET DB提供程序对象非常无用,无法使用.NET DateTime类型作为底层数据库。

Red Herrings
访问包括&#34;格式&#34; Date列的属性。这不会指定保存​​格式,但是您希望Access如何在IDE和用户中显示它。如果您向上引导vba表单并将该列映射到控件,它将使用该格式进行显示。

在所有情况下,格式都是未存储日期(输出)的方式。

同样,MySql提到了一个必需的&#34; yyyy-MM-dd&#34;格式。 仔细阅读文档后发现他们正在将日期数据作为文本进行讨论。例如,使用CLI甚至Workbench UI时要使用的格式。结果是 工作:

cmd.Parameters.Add("@p1", MySqlDbType.DateTime).Value = myDT.ToString("yyyy-MM-dd")

......但不需要。与之前一样,将<{em> 转换为一个字符串(因此是一个聪明的名字),其中包含日期数据。数据库提供程序对象必须将其解析回日期才能获得实际的

似乎就像是必需的日期格式,因为其他格式可能会失败。但这是因为您选择将日期转换为文本。这样可以正常工作:

DateTime

摘要

  • cmd.Parameters.Add("@p1", MySqlDbType.DateTime).Value = myDT 变量用于日期数据
  • 在数据库中存储日期日期日期字段
  • 使用DateTime指定如何向用户显示日期
  • 启用.ToString(...)以防止意外类型转换
  • 日期没有内在格式

1 可能