获得通用时区的正确方法

时间:2014-04-04 12:46:05

标签: c# asp.net-mvc asp.net-mvc-4 timezone

在我的项目中,我希望获得通用时区。我使用了两种不同的方法,但我不知道哪种方法是最好的方法。

第一种方法是

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方法。

可以解释上述两种方法之间的区别吗?

哪一个是最佳做法?

2 个答案:

答案 0 :(得分:2)

因为您在询问最佳做法:

  • 使用TimeZone类。如果您需要时区转换,请改用TimeZoneInfo类。这在the MSDN documentation中非常清楚:

    MSDN

  • 尽可能避免任何使用“本地”时间。它是运行代码的系统的本地。在绝大多数真实用例中,很可能是您用户的本地时区。在Web应用程序中尤其如此。

    这意味着您不应该调用以下任何

    • DateTime.Now
    • TimeZone.CurrentTimeZone
    • TimeZoneInfo.Local
    • DateTime.ToLocalTime()
    • DateTime.ToUniversalTime()
    • 涉及服务器本地时区的任何其他方法。

  • 相反,您的应用程序应该允许用户选择时区,然后您可以使用TimeZoneInfo.Convert...方法在该区域中的本地时间进行转换。 / p>

  • 如果您需要当前的通用时间,请使用DateTime.UtcNowDateTimeOffset.UtcNow

  • 如果您需要服务器的当前本地时区,请仅使用DateTimeOffset.Now

  • 如果您需要已知时区的当前当地时间,例如美国东部时间:

    DateTime easternNow = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
                                       DateTime.UtcNow, "Eastern Standard Time");
    
  • 如果要在已知时区和UTC之间进行转换,请使用TimeZoneInfo.ConvertTimeToUtcTimeZoneInfo.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

补充阅读:The Case Against DateTime.Now

答案 1 :(得分:-3)

世界时。

DateTime.Now.ToUniversalTime()

当地时间

DateTime.UtcNow.ToLocalTime()

Universal To Local

var nowUtc = DateTime.Now.ToUniversalTime();
var nowLocal = nowUtc.ToLocalTime();