为什么将日期转换为字符串会改变顺序?

时间:2014-08-12 14:51:28

标签: vb.net string date

这是一个由这个简单代码生成的特殊结果:

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

发生了什么事?尽管我甚至没有使用任何转换命令,为什么字符串会反转结果呢?

3 个答案:

答案 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#日期显示所示:

Culture is set to fr-FR

文化设定为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”的模式显示为您的文化。