20

次の ASP.Net MVC コントローラー メソッドがあります。

public ActionResult DoSomething(DateTime utcDate)
{
   var localTime = utcDate.ToLocalTime();
}

問題は、localTime が utcDate とまったく同じ値になることです。これは、utcDate が UTC 値を持っていることを認識していないためだと思います。私の質問は、utcDate (UTC であることがわかっている) をローカルに変換するにはどうすればよいですか?

4

4 に答える 4

48

に UTC 値が含まれていることがわかっている場合は、次を使用できます。DateTime

DateTime iKnowThisIsUtc = whatever;
DateTime runtimeKnowsThisIsUtc = DateTime.SpecifyKind(
    iKnowThisIsUtc,
    DateTimeKind.Utc);
DateTime localVersion = runtimeKnowsThisIsUtc.ToLocalTime();

たとえば、現在のアプリケーションでは、SQL を使用してデータベースにタイムスタンプを作成しますutcnowが、それらを C# アプリケーションにKind読み込むと、プロパティは常にになりUnknownます。タイムスタンプを読み取り、故意に に設定し、それを現地時間に変換するラッパー関数を作成しましたKindUtc基本的には上記のとおりです。

DateTime.ToLocalTime()次のいずれか (または両方) が当てはまる場合にのみ値に影響しないことに注意してください。

  • DateTimeプロパティKindDateTimeKind.Local
  • あなたのローカルタイムゾーンは、「変更なし」が正しい変換であるようです

2 番目の点は正しくないと推測できると思います。したがって、iKnowThisIsUtcKindプロパティはLocal既に設定されているようです。DateTimeこれらの s を提供しているものがローカルであると考える理由を理解する必要があります。

于 2012-10-17T15:39:23.163 に答える
5

次のことを試してください。

public static DateTime UtcToPacific(DateTime dateTime)
        {
            return TimeZoneInfo.ConvertTimeFromUtc(dateTime, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
        }

当然、Pacific をローカル タイムゾーンに変更します。

マシンに存在するタイム ゾーンを確認するには、次のリンクを参照してください: http://msdn.microsoft.com/en-us/library/bb397781.aspx

于 2012-10-17T15:38:49.670 に答える
5

MSDN で説明されているように、ToLocalTime() が機能する (そして日付を現地時間に変換する) には、Date の Kind プロパティを UTC にする必要があります。http://msdn.microsoft.com/en-us/library/system .datetime.tolocaltime.aspx

これを試して:

utcDate = DateTime.SpecifyKind(utcDate, DateTimeKind.Utc);
var localTime = utcDate.ToLocalTime();
于 2012-10-17T15:45:13.547 に答える
1

またはこれ:

var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0))
                    .ToLocalTime().DateTime;
于 2012-10-17T15:43:12.133 に答える