時刻の種類(Kindプロパティの値)はインスタンス作成時に設定された後は一切変更することができません。 ですが、DateTime.SpecifyKindメソッドを使うと日時部分はそのままで、Kindプロパティの値だけを指定した値に変更したDateTimeを取得することが出来ます。
DateTime.SpecifyKindメソッドを使って時刻の種類を変更する
Imports System
Class Sample
Shared Sub Main()
Dim a As New DateTime(2013, 4, 1, 15, 0, 30, 123, DateTimeKind.Local)
Dim b As New DateTime(2013, 4, 1, 15, 0, 30, 123, DateTimeKind.Utc)
Dim c As New DateTime(2013, 4, 1, 15, 0, 30, 123) ' DateTimeKind.Unspecified
Dim kinds() As DateTimeKind = New DateTimeKind() { _
DateTimeKind.Local, _
DateTimeKind.Utc, _
DateTimeKind.Unspecified _
}
For Each kind As DateTimeKind In kinds
Console.WriteLine("SpecifyKind({0})", kind)
For Each dt As DateTime In New DateTime() {a, b, c}
' SpecifyKindメソッドでKindの値を変更したDateTimeを取得する
Dim dtNew As DateTime = DateTime.SpecifyKind(dt, kind)
Console.WriteLine("{0} {1,-12} -> {2} {3}", dt, dt.Kind, dtNew, dtNew.Kind)
Next
Console.WriteLine()
Next
End Sub
End Class
実行結果
SpecifyKind(Local) 2013/04/01 15:00:30 Local -> 2013/04/01 15:00:30 Local 2013/04/01 15:00:30 Utc -> 2013/04/01 15:00:30 Local 2013/04/01 15:00:30 Unspecified -> 2013/04/01 15:00:30 Local SpecifyKind(Utc) 2013/04/01 15:00:30 Local -> 2013/04/01 15:00:30 Utc 2013/04/01 15:00:30 Utc -> 2013/04/01 15:00:30 Utc 2013/04/01 15:00:30 Unspecified -> 2013/04/01 15:00:30 Utc SpecifyKind(Unspecified) 2013/04/01 15:00:30 Local -> 2013/04/01 15:00:30 Unspecified 2013/04/01 15:00:30 Utc -> 2013/04/01 15:00:30 Unspecified 2013/04/01 15:00:30 Unspecified -> 2013/04/01 15:00:30 Unspecified
このメソッドはDateTimeの日時の部分は変更せず、Kindプロパティの値のみを変更します。 つまり、変更に際してUTCとローカル時刻間の時差は考慮されません。 そのため、このメソッドの主な目的は、DateTimeから時刻の種類の情報を切り離したい場合、あるいは時刻の種類が設定されていない(Unspecifiedな)状態のDateTimeに時刻の種類を設定することになります。
一方、UTCとローカル時刻間での時差を考慮した上で変更したい場合はToUniversalTime・ToLocalTimeメソッドを使います。