这是一个由这个简单代码生成的特殊结果:
Dim TodaysDate As Date = Date.Today ' Returns #8/12/2014#
Dim StringDate As String = TodaysDate ' Returns 12/08/2014
Dim AnotherStringDate As String = TodaysDate.ToString ' Returns 12/08/2014 00:00:00
发生了什么事?尽管我甚至没有使用任何转换命令,为什么字符串会反转结果呢?
答案 0 :(得分:2)
将Option Strict
更改为On
,然后您会收到编译器错误而不是奇怪的转换。一般来说,Date
不是String
,但可以表示为一个。
如果我没记错的话,VB使用Option Strict Off
的辅助方法自动转换位于命名空间Microsoft.VisualBasic.CompilerServices
中的类型。
我查看了源代码(使用ILSpy
)并找到了一个类StringType
,其中有一个方法FromDate
:
' Microsoft.VisualBasic.CompilerServices.StringType
Public Shared Function FromDate(Value As DateTime) As String
Dim ticks As Long = Value.TimeOfDay.Ticks
If ticks = Value.Ticks OrElse (Value.Year = 1899 AndAlso Value.Month = 12 AndAlso Value.Day = 30) Then
Return Value.ToString("T", Nothing)
End If
If ticks = 0L Then
Return Value.ToString("d", Nothing)
End If
Return Value.ToString("G", Nothing)
End Function
由于Date
来自Date.Today
这是当前没有时间的日期,因此将执行以If ticks = 0L Then
开头的代码(ticks
来自时间那天)。
返回:
Value.ToString("d", Nothing)
与Date.ToShortDateString
相同。自null
传递CultureInfo
以来,格式源自您当前的文化。显然,您当前的文化使用/
作为日期分隔符。
您也可以使用以下方式强制使用此格式:
Dim StringDate As String = TodaysDate.ToString("d")
StringDate = TodaysDate.ToShortdateString()
StringDate = TodaysDate.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture)
最后一个选项还可确保即使您当前的文化不同也会使用此格式。
答案 1 :(得分:0)
日期在内部存储为数字。并且日期/日期时间变量并不真正知道或关心它代表的实际日期;它只是一个数字(十进制)。字符串表示仅适用于我们的眼睛。当您将日期/日期时间变量转换为字符串类型时,它将以我们的机器语言环境设置指定的格式进行转换,除非我们明确告诉它将其转换为其他格式。
我假设您的电脑上的日期/时间设置是dd / mm / yyyy(印度格式)格式,而不是默认的mm / dd / yyyy(美国格式)。
所以这就是实际发生的事情:
' You store today's date in a Date variable and it returns #8/12/2014# i.e. 12-Aug-2014
Dim TodaysDate As Date = Date.Today
' You convert it to string. Since you didn't sepecify the format, it picks up the fromat settings from your PC regional settings.
' Returns 12/08/2014 which means 12-Aug-2014 (in your locale)
' You didn't do .ToString, but that's implicit, unless you set OPTION STRICT ON, in which case it will force you to put .ToString
Dim StringDate As String = TodaysDate
' Same argument as above.
Dim AnotherStringDate As String = TodaysDate.ToString ' Returns 12/08/2014 00:00:00
答案 2 :(得分:0)
问题why converting a date to a string changes the order
?答案是它没有。
当您转换为字符串时,将使用您的本地文化格式,如Tim所述。这不是VB中日期文字的情况。
日期文字 - 哈希之间的值,例如#02/11/2014#
- 始终以InvariantCulture或“m / d / y”模式显示。这可能是因为当您希望使用文字创建日期时,必须以该格式指定日期和月份。见MSDN:
Date literals must be in the format #m/d/yyyy# or they are invalid.
因此,在一个模式中向您显示日期,但要求您使用不同的模式创建日期是没有意义的。这就是VB工作的方式(部分原因是遗留功能没有超出当地使用的文化概念)。这是一个VB-ism,如Visual Studio中的VB vs C#日期显示所示:
文化设定为fr-FR。
但是你的字符串最终代表相同的日期 - 他们可以进行往返:
Dim TodaysDate As Date = Date.Today ' Returns #8/12/2014#
Dim AnotherStringDate As String = TodaysDate.ToString
Dim mydt As DateTime = DateTime.Parse(AnotherStringDate)
If mydt = TodaysDate Then
Console.Beep()
End If
它会发出哔哔声,因为相同的DateTime是从字符串创建的,即使它可能以“d / m / y”的模式显示为您的文化。