web-dev-qa-db-ja.com

特定のタイムゾーンでDateTimeを変換する方法は?

UTCがどのように機能するかを理解するのは難しいと思います。

私は次のことをしなければなりませんが、正しい結果が得られるかどうか、まだ混乱しています。

目的:

  1. データベースに保存されているすべての日付がUTC形式であることを確認します
  2. 更新DefaultTimezoneはマニラ時間です
  3. 返される日付がすべてマニラ時間であることを確認します

したがって、コードは次のとおりです。

public ConvertDate(DateTime? dateTime)
{
    if (dateTime != null)
    {
        Value = (DateTime)dateTime;
        TimeZone = GetFromConfig.DefaultTimeZone(); 
    }
}


public ConvertDate(DateTime? dateTime, int GMTTimeZone)
{
    if (dateTime != null)
    {
        Value = (DateTime)dateTime;
        TimeZone = GMTTimeZone;
    }
}


public int TimeZone
{
    get { return m_TimeZone; }
    set { m_TimeZone = value; }
}


DateTime m_Value;
public DateTime Value
{
    get { return m_Value; }
    set 
    { 
        m_Value = value;
        DateTime converted = m_Value.ToUniversalTime().ToLocalTime();
    }
}

サンプル使用法:

DateTime SampleInputFromUser = new DateTime(2012, 1, 22);
ConvertDate newConversion = new ConvertDate(SampleInputFromUser, 21);
DateTime answer = newConversion.Value;

今、私は「TimeZone」について混乱しています。目標を達成するためにそれを使用する方法がわかりません。
私の質問を理解し、目標を達成するためのアイデアをお持ちください。

編集

@raveturnedの回答によると、次のコードが表示されます。

*** ConvertDateメソッドに追加

TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());
ManilaTime = TimeZoneInfo.ConvertTime(dateTime.Value, TimeZoneInfo.Local, timeInfo).ToUniversalTime();

**新しいプロパティ

DateTime _ManilaTime;
public DateTime ManilaTime
{
    get { return _ManilaTime; }
    set { _ManilaTime = value; }
}
29
fiberOptics

.NETフレームワークには、異なるタイムゾーン間でDateTimeを変換するために使用可能なクラスとメソッドが既にあります。 TimeZoneInfo クラスのConvertTimeメソッドをご覧ください。

編集:正しいタイムゾーン情報で作成されたと仮定して、データベースに入れる時間を取得したら、簡単にUTCに変換できます:

DateTime utcTime = inputDateTime.ToUniversalTime();

質問の編集で行ったようにtimeInfoを取得します。

TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());

データベース時間をユーザーに送信するとき、timeInfoを使用して正しい時間帯に変換します。

DateTime userTime = TimeZoneInfo.ConvertTimeFromUtc(dbDateTime, timeInfo);

個人的には、このロジックを適切なget/setメソッドとは別にしようとします。

57
raveturned
TimeZoneInfo infotime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time (Mexico)");
DateTime thisDate = TimeZoneInfo.ConvertTimeFromUtc(datetimeFromBD, infotime);
5
Roger Tello
var date = System.TimeZoneInfo.ConvertTimeFromUtc(
    DateTime.UtcNow, 
    TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
1
Kevin

他の人を助けるには:

    static void ChangeTimezone()
    {
        // Timezone string here:
        foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones())
            Console.WriteLine(z.Id);

        // Use one of those timezone strings
        DateTime localDt = DateTime.Today;
        DateTime utcTime = localDt.ToUniversalTime();
        TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time");
        DateTime estDt = TimeZoneInfo.ConvertTimeFromUtc(utcTime, timeInfo);
        return;
    }
0
user3761555