如何在特定时区转换DateTime? [英] How to convert DateTime in Specific timezone?
问题描述
我必须执行以下操作,但如果我得到正确的结果,我仍然感到困惑。
目标:
- 确保数据库中的所有保存日期均为UTC格式
- 更新DefaultTimezone在马尼拉时间
- 确保所有返回的日期都在马尼拉时间
所以代码是:
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;
}
有可用于在不同时区之间转换DateTimes的类和方法。看看 TimeZoneInfo 类的ConvertTime方法。
编辑:当您有时间放入数据库时,假设它是使用正确的时区信息创建的,您可以轻松转换为UTC:
DateTime utcTime = inputDateTime.ToUniversalTime();
获取timeInfo,在编辑问题中完成:
TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());
当您将数据库时间发送给用户时,请使用 timeInfo
。
DateTime userTime = TimeZoneInfo.ConvertTimeFromUtc(dbDateTime,timeInfo);
个人我会尝试将这个逻辑与适当的get / set方法分开。 >
I find it hard to understand how UTC works.
I have to do the following but I'm still confused if I'd get the right result.
Objectives:
- Ensure all saved dates in Database are in UTC format
- Update DefaultTimezone is in Manila time
- Ensure all returned dates are in Manila Time
So the code is:
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();
}
}
Sample usage:
DateTime SampleInputFromUser = new DateTime(2012, 1, 22);
ConvertDate newConversion = new ConvertDate(SampleInputFromUser, 21);
DateTime answer = newConversion.Value;
Now I get confused for 'TimeZone'. I don't know how to use it to get the objectives.
Hope you understand my question and have the idea to get the objectives done.
Edit
According to @raveturned answer, I get this following code:
***Added in ConvertDate method
TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());
ManilaTime = TimeZoneInfo.ConvertTime(dateTime.Value, TimeZoneInfo.Local, timeInfo).ToUniversalTime();
**New Property
DateTime _ManilaTime;
public DateTime ManilaTime
{
get { return _ManilaTime; }
set { _ManilaTime = value; }
}
The .NET framework already has classes and methods available to convert DateTimes between different time zones. Have a look at the ConvertTime methods of the TimeZoneInfo class.
Edit: When you get the time to put into the database, assuming it was created with correct time zone information you can easily convert to UTC:
DateTime utcTime = inputDateTime.ToUniversalTime();
Get timeInfo as done in the question edit:
TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());
When you send the database time to user, convert it to the correct timezone using timeInfo
.
DateTime userTime = TimeZoneInfo.ConvertTimeFromUtc(dbDateTime, timeInfo);
Personally I'd try and keep this logic separate from the propery get/set methods.
这篇关于如何在特定时区转换DateTime?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!