如何在特定时区转换DateTime?

fib*_*ics 30 c# datetime utc

我发现很难理解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();
    }
}
Run Code Online (Sandbox Code Playgroud)

样品用法:

DateTime SampleInputFromUser = new DateTime(2012, 1, 22);
ConvertDate newConversion = new ConvertDate(SampleInputFromUser, 21);
DateTime answer = newConversion.Value;
Run Code Online (Sandbox Code Playgroud)

现在我对'TimeZone'感到困惑.我不知道如何使用它来实现目标.
希望您理解我的问题,并有想法完成目标.

编辑

根据@raveturned的回答,我得到以下代码:

***在ConvertDate方法中添加

TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());
ManilaTime = TimeZoneInfo.ConvertTime(dateTime.Value, TimeZoneInfo.Local, timeInfo).ToUniversalTime();
Run Code Online (Sandbox Code Playgroud)

**新物业

DateTime _ManilaTime;
public DateTime ManilaTime
{
    get { return _ManilaTime; }
    set { _ManilaTime = value; }
}
Run Code Online (Sandbox Code Playgroud)

rav*_*ned 65

.NET框架已经具有可用于在不同时区之间转换DateTime的类和方法.看看TimeZoneInfo类的ConvertTime方法.

编辑:当您有时间放入数据库时​​,假设它是使用正确的时区信息创建的,您可以轻松转换为UTC:

DateTime utcTime = inputDateTime.ToUniversalTime();
Run Code Online (Sandbox Code Playgroud)

在问题编辑中获取timeInfo:

TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());
Run Code Online (Sandbox Code Playgroud)

将数据库时间发送给用户时,请使用将其转换为正确的时区timeInfo.

DateTime userTime = TimeZoneInfo.ConvertTimeFromUtc(dbDateTime, timeInfo);
Run Code Online (Sandbox Code Playgroud)

就个人而言,我会尝试将此逻辑与有利的get/set方法分开.

  • 此[时区ID列表](http://stackoverflow.com/a/7908482/29)可能会有所帮助 (23认同)

Pho*_*son 6

var date = System.TimeZoneInfo.ConvertTimeFromUtc(
    DateTime.UtcNow, 
    TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
Run Code Online (Sandbox Code Playgroud)

  • 虽然这段代码可以回答作者的问题,但它缺乏解释。原始片段没有帮助。查看帮助页面,了解有关 [如何写出好的答案](https://stackoverflow.com/help/how-to-answer) 的更多信息。 (3认同)

Rog*_*llo 5

TimeZoneInfo infotime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time (Mexico)");
DateTime thisDate = TimeZoneInfo.ConvertTimeFromUtc(datetimeFromBD, infotime);
Run Code Online (Sandbox Code Playgroud)