在C#中将UTC日期时间转换为本地日期时间

时间:2019-01-28 07:04:09

标签: c# datetime timezone

我想显示活动的日期和时间,该日期和时间将根据用户的时区进行管理。要检查时区,我将系统时区更改为另一个时区,但是我的代码仍在获取本地时区。 这是我的代码

我正在使用Cassendra数据库和C#.NET MVC

DateTime startTimeFormate = x.Startdate;
DateTime endTimeFormate = x.Enddate;
TimeZone zone = TimeZone.CurrentTimeZone;
DateTime startTime = zone.ToLocalTime(startTimeFormate);
DateTime endTime = zone.ToLocalTime(endTimeFormate);

4 个答案:

答案 0 :(得分:0)

根据MSDN documentation of the TimeZone.CurrentTimeZone property,在首次调用TimeZone.CurrentTimeZone之后将缓存本地时区。实际上,这意味着只要不支持时区中间运行的动态更新,您的代码就可以正常运行。为了立即查看更改,在致电TimeZone.CurrentTimeZone之前,您应该致电

TimeZoneInfo.ClearCachedData();

在MSDN文章中对此进行了记录,如下所示:

  

给来电者的提示

     

首先使用CurrentTimeZone缓存本地时区数据   检索时区信息。如果系统的本地时区   随后更改,CurrentTimeZone属性不会反映   这个变化。如果您需要在   应用程序正在运行,请使用TimeZoneInfo类并调用其   ClearCachedData()方法。

答案 1 :(得分:0)

要将UTC DateTime转换为Local DateTime,必须使用TimeZoneInfo,如下所示:

DateTime startTimeFormate = x.Startdate; // This  is utc date time
TimeZoneInfo systemTimeZone = TimeZoneInfo.Local;
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(startTimeFormate, systemTimeZone);

此外,如果要将UTC DateTime转换为用户特定的Local DateTime,请执行以下操作:

string userTimeZoneId = "New Zealand Standard Time";
TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(userTimeZoneId);
DateTime userLocalDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, userTimeZoneId);

注意:TimeZone中的.NET现在是obsolete,已被弃用。而是使用TimeZoneInfo

答案 2 :(得分:0)

这些是我使用的DateTime助手,涵盖了到目前为止我需要的所有情况。

public static class DateTimeHelpers
  {
    public static DateTime ConvertToUTC(DateTime dateTimeToConvert, string sourceZoneIdentifier)
    {
      TimeZoneInfo sourceTZ = TimeZoneInfo.FindSystemTimeZoneById(sourceZoneIdentifier);
      TimeZoneInfo destinationTZ = TimeZoneInfo.FindSystemTimeZoneById("UTC");

      return TimeZoneInfo.ConvertTime(dateTimeToConvert, sourceTZ, destinationTZ);
    }

    public static DateTime ConvertToTimezone(DateTime utcDateTime, string destinationZoneIdentifier)
    {
      TimeZoneInfo sourceTZ = TimeZoneInfo.FindSystemTimeZoneById("UTC");
      TimeZoneInfo destinazionTZ = TimeZoneInfo.FindSystemTimeZoneById(destinationZoneIdentifier);

      return DateTime.SpecifyKind(TimeZoneInfo.ConvertTime(utcDateTime, sourceTZ, destinazionTZ), DateTimeKind.Local);
    }

    public static DateTime GetCurrentDateTimeInZone(string destinationZoneIdentifier)
    {
      TimeZoneInfo sourceTZ = TimeZoneInfo.FindSystemTimeZoneById("UTC");
      TimeZoneInfo destinazionTZ = TimeZoneInfo.FindSystemTimeZoneById(destinationZoneIdentifier);

      return DateTime.SpecifyKind(TimeZoneInfo.ConvertTime(DateTime.UtcNow, sourceTZ, destinazionTZ), DateTimeKind.Local);
    }
  }

答案 3 :(得分:0)

TimeZone.CurrentTimeZoneTimeZoneInfo.LocalToLocalTime使用服务器的本地时区,而不是最终用户。

相反,请先参见how to reliably get the end-users's time zone in your .NET code

然后,假设您现在有一个TimeZoneInfo对象,只需使用TimeZoneInfo.ConvertTimeFromUtc方法。