時刻の種類(Kindプロパティの値)はインスタンス作成時に設定された後は一切変更することができません。 ですが、DateTime.SpecifyKindメソッドを使うと日時部分はそのままで、Kindプロパティの値だけを指定した値に変更したDateTimeを取得することが出来ます。
DateTime.SpecifyKindメソッドを使って時刻の種類を変更する
using System;
class Sample {
static void Main()
{
var a = new DateTime(2013, 4, 1, 15, 0, 30, 123, DateTimeKind.Local);
var b = new DateTime(2013, 4, 1, 15, 0, 30, 123, DateTimeKind.Utc);
var c = new DateTime(2013, 4, 1, 15, 0, 30, 123); // DateTimeKind.Unspecified
var kinds = new[] {
DateTimeKind.Local,
DateTimeKind.Utc,
DateTimeKind.Unspecified,
};
foreach (var kind in kinds) {
Console.WriteLine("SpecifyKind({0})", kind);
foreach (DateTime dt in new DateTime[] {a, b, c}) {
// SpecifyKindメソッドでKindの値を変更したDateTimeを取得する
DateTime dtNew = DateTime.SpecifyKind(dt, kind);
Console.WriteLine("{0} {1,-12} -> {2} {3}", dt, dt.Kind, dtNew, dtNew.Kind);
}
Console.WriteLine();
}
}
}
実行結果
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メソッドを使います。