UTCがどのように機能するかを理解するのは難しいと思います。
私は次のことをしなければなりませんが、正しい結果が得られるかどうか、まだ混乱しています。
目的:
したがって、コードは次のとおりです。
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; }
}
.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メソッドとは別にしようとします。
TimeZoneInfo infotime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time (Mexico)");
DateTime thisDate = TimeZoneInfo.ConvertTimeFromUtc(datetimeFromBD, infotime);
var date = System.TimeZoneInfo.ConvertTimeFromUtc(
DateTime.UtcNow,
TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
他の人を助けるには:
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;
}