Как установить часовой пояс по умолчанию для настольного приложения C #?

#c# #api

#c# #API

Вопрос:

У меня есть настольное приложение c #, которое использует API. Мой клиент из другого часового пояса. Итак, когда мы оба используем один и тот же API, мы получаем разное время даты, даже если дата в базе данных одинакова. Как я могу установить часовой пояс по умолчанию для своего приложения в коде c #, чтобы при доступе к нему из среды разработки я мог установить свой часовой пояс, а при развертывании его в рабочей среде я мог установить часовой пояс моего клиента? Я уже отладил и нашел .NET автоматически преобразует время, как только получает ответ от API, поэтому я ничего не могу сделать в потоке ответов.

Комментарии:

1. Сохраните формат UTC в базе данных и верните тот же формат, отобразите даты в клиенте в соответствии с культурным форматом клиента

2. @sujithkarivelil: Это не всегда правильно. Широко распространено мнение, что это «серебряная пуля», но если дата / время будут в будущем, вы вполне можете потерять информацию, в результате чего данные станут недействительными при изменении правил часового пояса. Смотрите codeblog.jonskeet.uk/2019/03/27 /…

3. В принципе, у нас недостаточно информации, чтобы ответить на этот вопрос, потому что это зависит от API. Как получить доступ к этому API? Есть ли у него поддержка часовых поясов? Пожалуйста, предоставьте дополнительную информацию.

4. Нет, в API нет никакой информации о часовом поясе. Это экономит время в базе данных в формате ‘2019-04-25 08:54:11’.

5. Возможно, только мы получаем часовой пояс клиента. Мы можем получить эту информацию из браузера клиента.

Ответ №1:

если дата-время меняется для вас и вашего клиента, это означает, что к дате-времени при его извлечении из API привязано значение смещения.

Итак, выполните проверку среды разработки в вашем приложении и извлеките дату и время UTC, используя свойство «UtcDateTime» типа DateTimeOffset и отобразите его в пользовательском интерфейсе, чтобы оно было одинаковым как для вас, так и для вашего клиента. В случае производственной среды просто продолжайте работать в обычном режиме.

 if(IsDevEnvironment)
   DateTimeToDisplay = ApiResponse.DateTimeInDB.UtcDateTime;  // assuming DateTimeInDB is of DateTimeOffset type
else
   DateTimeToDisplay = ApiResponse.DateTimeInDB
  

Ответ №2:

Вот способ установить часовой пояс, например, восточный часовой пояс.

 TimeZoneInfo easternZone;
try { easternZone = TimeZoneInfo.FindSystemTimeZoneById("E. Africa Standard Time"); }
catch (TimeZoneNotFoundException) { easternZone = TimeZoneInfo.FindSystemTimeZoneById("Africa/Nairobi"); }
var timestamp = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, easternZone);
  

Комментарии:

1. Я понял ваш ответ, но проблема в том, что, как только мое приложение получает ответ, оно преобразует дату и время, а преобразованное время даты меньше или опережает на один день его фактическое значение. Итак, как я могу сообщить. СЕТЬ не позволяет автоматически преобразовывать дату и время?

2. Я отвечал на заголовок «Как установить часовой пояс», возможно, название вводит в заблуждение. Какой часовой пояс требуется для API?

Ответ №3:

попробуйте это ;

 HAVING        (Time BETWEEN DATEADD(d, - 1, GETUTCDATE()) AND GETUTCDATE())
  

это полезно для меня.

пример

 ELECT        Time, username, COUNT(username) AS CountOfusername
FROM            dbo.tabl
GROUP BY Time, username
HAVING        (Time BETWEEN DATEADD(d, - 1, GETUTCDATE()) AND GETUTCDATE())
  

Редактировать

  DateTime hwTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, "Arab Standard Time");
        //DateTime hwTime = new DateTime();
        try
        {
            TimeZoneInfo hwZone = TimeZoneInfo.FindSystemTimeZoneById("Arab Standard Time");
            Console.WriteLine("{0} {1} is {2} local time.",
                    hwTime,
                    hwZone.IsDaylightSavingTime(hwTime) ? hwZone.DaylightName : hwZone.StandardName,
                    TimeZoneInfo.ConvertTime(hwTime, hwZone, TimeZoneInfo.Local));
        }
        catch (TimeZoneNotFoundException)
        {
            Console.WriteLine("The registry does not define the Arab Standard Time zone.");
        }
        catch (InvalidTimeZoneException)
        {
            Console.WriteLine("Registry data on the Arab Standard Time zone has been corrupted.");
        }
  

используйте этот код в своем приложении

Комментарии:

1. Не могли бы вы, пожалуйста, привести пример реализации?

2. @ThamaraiT проверьте сейчас