web-dev-qa-db-ja.com

UTC DateTimeをローカルDateTimeに変換

次のASP.Net MVC Controllerメソッドがあります。

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

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

17

knowDateTimeにUTC値が含まれている場合、 以下 を使用できます。

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

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

DateTime.ToLocalTime() は、次のいずれか(または両方)が成り立つ場合にのみ値に影響を与えないことに注意してください。

  • DateTimeKindプロパティは_DateTimeKind.Local_
  • ローカルタイムゾーンでは、「変更なし」が正しい変換です

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

44
Rawling

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();
5
tranceporter

以下を試してください:

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

太平洋をローカルタイムゾーンに変更します。

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

4
Robert H

またはこれ:

var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0))
                    .ToLocalTime().DateTime;
1
Yann Olaf