1

CTime::GetTime()メソッドの動作をC#で実装しようとしています。

ここに、私のコンソール アプリケーション (C++/CLI で記述) のコード スニペットがあります。

int main(array<System::String ^> ^args)
{
 int epochYear = 1970;
 int epochMonth = 1;
 int epochDay = 1;

 DateTime managedEpochDate = DateTime(epochYear, epochMonth, epochDay);

 int year = 2013;
 int month = 2;
 int day = 13;
 int hour = 9;
 int minutes = 49;
 int seconds = 46;

 // DateTime/CTime -> Numeric Time (__time64_t)

 DateTime managedDateTime = DateTime(year, month, day, hour, minutes, seconds);
 CTime nativeDateTime = CTime(year, month, day, hour, minutes, seconds);

 DWORD nativeTimeToSerialize = nativeDateTime.GetTime();
 UInt32 managedTimeToSerialize = (managedDateTime - managedEpochDate)
     .TotalSeconds;
}

最後に、次の異なる値があります。

  • nativeTimeToSerialize = 1360745386
  • managedTimeToSerialize = 1360748986

この違いの理由を理解するのを手伝ってくれる人はいますか?

4

1 に答える 1

1

違いは、使用しているCTimeコンストラクターが時刻を UTC に変換するという事実によるものです。

このコンストラクターは、UTC への適切な変換を行います。

この場合、DateTimeコンストラクター (およびのコンストラクター) はタイムゾーンを認識しません。

Kindプロパティは に初期化されますDateTimeKind.Unspecified

減算演算子DateTimeタイムゾーンを考慮しません。

メソッドは、減算を実行するときに、2 つの値のプロパティのSubtraction(DateTime, DateTime)値を考慮しません。KindDateTime

目的の結果を取得するには、CTimeコンストラクターの最後のパラメーターを適切に設定します。

CTime nativeDateTime = CTime(year, month, day, hour, minutes, seconds, 0);

DateTime代わりに使用法を変更するには、次のものが必要です。

int epochYear = 1970;
int epochMonth = 1;
int epochDay = 1;

DateTime managedEpochDateUtc
    = new DateTime(epochYear, epochMonth, epochDay, 0, 0, 0, DateTimeKind.Utc);

int year = 2013;
int month = 2;
int day = 13;
int hour = 9;
int minutes = 49;
int seconds = 46;

DateTime managedDateTimeLocal
    = new DateTime(year, month, day, hour, minutes, seconds, DateTimeKind.Local);

DateTime managedDateTimeUtc = managedDateTimeLocal.ToUniversalTime();

uint managedTimeToSerialize = (uint)(managedDateTimeUtc - managedEpochDateUtc)
 .TotalSeconds;

または、MgetzDateTimeOffsetによって提案されているように、の代わりに使用できます。これは、タイムゾーンを明確に処理しないDateTimeため、一般的に推奨されます。DateTime

于 2013-10-25T12:36:57.313 に答える