我有代码:
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。
您能否帮助更好地设置日期格式。
非常感谢
答案 0 :(得分:1)
这个问题有几个常见的误解。
首先,也许最重要的是,你应该开启Option Strict
。您可能会进行一些隐式转换。
tempDate = exWS.Cells(exRow, myMatchedColumns(2)).value
我不知道如何声明tempDate
,但我很确定excel单元格值是对象。因此,tempDate
充其量只是一个标有Object
的日期。
dueDate = Format("dd/MM/yyyy", tempDate)
那不会"格式化日期"。它将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提供程序对象和定义为 Red Herrings 在所有情况下,格式都是未存储日期(输出)的方式。 同样,MySql提到了一个必需的&#34; yyyy-MM-dd&#34;格式。 仔细阅读文档后发现他们正在将日期数据作为文本进行讨论。例如,使用CLI甚至Workbench UI时要使用的格式。结果是 工作: ......但不需要。与之前一样,将<{em> 转换为一个字符串(因此是一个聪明的名字),其中包含日期数据。数据库提供程序对象必须将其解析回日期才能获得实际的值。 似乎就像是必需的日期格式,因为其他格式可能会失败。但这是因为您选择将日期转换为文本。这样可以正常工作: 1 可能 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
类型作为底层数据库。
访问包括&#34;格式&#34; Date列的属性。这不会指定保存格式,但是您希望Access如何在IDE和用户中显示它。如果您向上引导vba表单并将该列映射到控件,它将使用该格式进行显示。cmd.Parameters.Add("@p1", MySqlDbType.DateTime).Value = myDT.ToString("yyyy-MM-dd")
DateTime
摘要
cmd.Parameters.Add("@p1", MySqlDbType.DateTime).Value = myDT
变量用于日期数据DateTime
指定如何向用户显示日期.ToString(...)
以防止意外类型转换