web-dev-qa-db-ja.com

C#(.NET)でDateTimeKind.UnspecifiedタイプのDateTimeをDateTime.Kind.Utcに変換する方法

KindプロパティがDateTimeKind.Unspecifiedである非常に多くのDateTimeを持つC#コードを継承しました。これらはDatetime.ToUniversalTime()に供給され、UTC日時が返されます(私の場合は7時間追加されます)。これがToUniversalTime()の仕組みです。 MSDNを参照してください。問題は、これらのDateTimesが実際には既にUTC時間になっていることです。それらは、SQL Server Compact 4.0データベースから取り出されます。それらはUTCで保存されました。私の主な質問は:

  1. DateTimeのKindプロパティを変更して、指定されていないUTCになるようにするにはどうすればよいですか?時刻や日付を変更したくありません。たとえば、2013年4月1日午前9時5分の日付が「未指定」のKindプロパティである場合、2013年4月1日9時5分UTCの日時になります。

フォローアップの質問に満足できたら、次のようになります。

  1. SQL Server Compactから値は必ず「指定なし」として返されますか? Sql Server Compact内では、これらは型(datetime、null以外)として格納されています。コードを見ると、それらはデータベースに置かれているように見えますが、UTCなどとしてマークするための規定はありません。物事を処理するより良い方法はありますか? DateTimesがUTCとしてSQL Compactから出力されることを保証する洗練された方法はありますか?

詳細を提供できるかどうか教えてください。私はこのコードベースは初めてですが、まだ頭を悩ませているので、問題を完全に説明するのに苦労しています。

デイブ

25
Dave

次のようなものが必要ですか?

_var unspecified = new DateTime(2016, 12, 12, 10, 10, 10, DateTimeKind.Unspecified);
var specified = DateTime.SpecifyKind(unspecified, DateTimeKind.Utc);
_

[〜#〜] msdn [〜#〜] :からのSpecifyKind()メソッドについて

SpecifyKindメソッドは、指定されたkindパラメーターと元の時刻値を使用して、新しいDateTimeオブジェクトを作成します。

新しいオブジェクト、新しい種類、同じ時間値を作成します。既存のオブジェクトの種類を変更することはできません。同じ値で異なる種類の新しいオブジェクトを作成する必要があります。

ここの他の質問に関しては、 SQL Compact でサポートされているタイプです。そして、これは DateTimeOffset に関する問題です。 Sql Compactではまだサポートされていないようです。

38
kat1330

私は拡張メソッドを使用します:

_public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind)
{        
    var NewDT = New DateTime(DT.Year, DT.Month, DT.Day, DT.Hour, DT.Minute, DT.Second, DT.Millisecond, DTKind);
    Return NewDT;
}
_

これは、DateTime.SpecifyKind(unspecified, DateTimeKind.Utc)を毎回入力するよりも、LINQで使用する方がはるかに短いです。

例えば:

_table.Where((x) x.StartTimeStampUTC.SetKind(DateTimeKind.Utc).ToString("G") = GUIStartTimeStampTxt.Text)
_
4

上記の2つの答えを組み合わせて、よりクリーンなソリューションを得ることができます...

public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind)
{        
    return DateTime.SpecifyKind(DT, DTKind);
}
3
Paul Lambert