Преобразование UTC DateTime в локальный DateTime в C # - PullRequest
0 голосов
/ 28 января 2019

Я хочу показать дату и время события, которое будет управляться в соответствии с часовым поясом пользователя.Чтобы проверить часовой пояс, я изменяю свой системный часовой пояс на другой часовой пояс, но мой код все еще получает местный часовой пояс.Вот мой код

Я использую базу данных 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 голосов
/ 28 января 2019

TimeZone.CurrentTimeZone, TimeZoneInfo.Local и ToLocalTime используют локальный часовой пояс сервера , а не конечного пользователя.

Вместо этого сначала см. какнадежно получить часовой пояс конечных пользователей в вашем .NET-коде .

Затем, если у вас есть объект TimeZoneInfo, просто используйте метод TimeZoneInfo.ConvertTimeFromUtc.

0 голосов
/ 28 января 2019

Чтобы преобразовать 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 является устаревшим сейчас, и оно устарело.Вместо этого используйте TimeZoneInfo.

0 голосов
/ 28 января 2019

Это помощники 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);
    }
  }
0 голосов
/ 28 января 2019

Согласно документации MSDN свойства TimeZone.CurrentTimeZone , местный часовой пояс кэшируется после первого вызова TimeZone.CurrentTimeZone.На практике это означает, что ваш код должен работать нормально до тех пор, пока не поддерживаются динамические обновления промежуточной зоны часового пояса.Чтобы немедленно увидеть изменения, перед вызовом TimeZone.CurrentTimeZone вы должны позвонить

TimeZoneInfo.ClearCachedData();

. Это описано в статье MSDN следующим образом:

Примечания для абонентов

Данные о часовом поясе кэшируются после того, как CurrentTimeZone впервые используется для получения информации о часовом поясе.Если местный часовой пояс системы впоследствии изменяется, свойство CurrentTimeZone не отражает это изменение.Если вам нужно обрабатывать изменения часового пояса во время работы приложения, используйте класс TimeZoneInfo и вызовите его метод ClearCachedData ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...