如何在特定时区转换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; } } 

.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);