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



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

我正在使用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);

要将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);

注意:.NET 中的TimeZone现已过时,并且已被弃用。请改用TimeZoneInfo .

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

相反,请首先了解如何在 .NET 代码中可靠地获取最终用户的时区。

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

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

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);
    }
  }

根据 TimeZone.CurrentTimeZone 属性的 MSDN 文档,本地时区在首次调用 TimeZone.CurrentTimeZone 后缓存。实际上,这意味着只要不支持中途时区的动态更新,您的代码就应该运行良好。为了立即看到更改,在呼叫TimeZone.CurrentTimeZone之前,您应该致电

TimeZoneInfo.ClearCachedData();

MSDN 文章中对此进行了说明,如下所示:

来电者注意事项

本地时区数据在首次使用当前时区后缓存 检索时区信息。如果系统的本地时区 随后更改,当前时区属性不反映 此更改。如果您需要处理时区更改,而 应用程序正在运行,使用 TimeZoneInfo 类并调用其 ClearCachedData() 方法。

相关内容

  • 没有找到相关文章

最新更新