在我的项目中,我希望获得通用时区。我使用了两种不同的方法,但我不知道哪种方法是最好的方法。
第一种方法是
public static DateTime GetUniversalTime(DateTime localDateTime)
{
TimeZone zone = TimeZone.CurrentTimeZone;
DateTime universal = zone.ToUniversalTime(localDateTime);
return universal;
}
然后我想恢复到当地时间,我使用了以下方法:
public static DateTime GetLocalTime(DateTime universalDateTime)
{
TimeZone zone = TimeZone.CurrentTimeZone;
DateTime local = zone.ToLocalTime(universalDateTime);
return local;
}
第二种方法是获得通用时区DateTime.UtcNow;
然后我想恢复到当地时间我使用上面的GetLocalTime
方法。
可以解释上述两种方法之间的区别吗?
哪一个是最佳做法?
答案 0 :(得分:2)
因为您在询问最佳做法:
不使用TimeZone
类。如果您需要时区转换,请改用TimeZoneInfo
类。这在the MSDN documentation中非常清楚:
尽可能避免任何使用“本地”时间。它是运行代码的系统的本地。在绝大多数真实用例中,很可能不是您用户的本地时区。在Web应用程序中尤其如此。
这意味着您不应该调用以下任何:
DateTime.Now
TimeZone.CurrentTimeZone
TimeZoneInfo.Local
DateTime.ToLocalTime()
DateTime.ToUniversalTime()
相反,您的应用程序应该允许用户选择时区,然后您可以使用TimeZoneInfo.Convert...
方法在该区域中的本地时间进行转换。 / p>
如果您需要当前的通用时间,请使用DateTime.UtcNow
或DateTimeOffset.UtcNow
。
如果您需要服务器的当前本地时区,请仅使用DateTimeOffset.Now
。
如果您需要已知时区的当前当地时间,例如美国东部时间:
DateTime easternNow = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
DateTime.UtcNow, "Eastern Standard Time");
如果要在已知时区和UTC之间进行转换,请使用TimeZoneInfo.ConvertTimeToUtc
和TimeZoneInfo.ConvertTimeFromUtc
方法,并确保传入要转换为/来自的时区:
// get the local time zone of your user, not of the server!
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
// use this to convert from UTC to local
DateTime local = TimeZoneInfo.ConvertTimeFromUtc(yourUtcDateTime, tzi);
// use this to convert from local to UTC
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(yourLocalDateTime, tzi);
请注意,当您从本地转换为UTC时,在夏令时转换期间可能会遇到歧义。请阅读the DST tag wiki。
答案 1 :(得分:-3)
世界时。
DateTime.Now.ToUniversalTime()
当地时间
DateTime.UtcNow.ToLocalTime()
Universal To Local
var nowUtc = DateTime.Now.ToUniversalTime();
var nowLocal = nowUtc.ToLocalTime();