Как изменить часовой пояс для приложения asp.net
Мне нужно установить часовой пояс по умолчанию для моего ASP.NET для Азии/Дакки или часовой пояс GMT + 6. Но я не могу найти способ изменить его во всем мире. Существует много ссылок на Stackoverflow и остальной части Интернета для этого, получая информацию о часовом поясе и рассчитывая правильное время для каждого момента, когда мне нужен объект DateTime.
Но поверьте мне, я не хочу так поступать. Поэтому не предлагайте мне такого предложения. Я хочу установить часовой пояс для Азии/Дакки или GMT + 6, предпочтительно из web.config. (Аналогично, мы делаем в php с php.ini) Так что каждый раз, когда мне нужен объект DateTime, время оценивается с моим часовым поясом независимо от того, какой часовой пояс для сервера.
Возможно ли это? Если возможно, то как?
Заранее спасибо за решение:)
Ответы
Ответ 1
Извините, что в .NET нет способа изменить часовой пояс.
Единственный способ, с помощью которого вы можете изменить часовой пояс своего сервера или переписать весь свой код.
Лучшая практика - не полагаться на системный часовой пояс вообще (никогда не используйте DateTime.Now).
Вы должны обрабатывать все даты как даты Utc, а затем преобразовывать их в определенную зону при их отображении пользователям.
Даже если вам удастся обрабатывать часовые пояса в вашем приложении ASP.NET, на SQL Server все еще есть часовые пояса, например GETTIME funtion. Если ваше приложение полностью написано в формате UTC, ваша функция SQL-сервера также будет работать.
Ответ 2
Вы можете изменить TimeZone... и Get Date
DateTime utcTime = DateTime.UtcNow;
TimeZoneInfo myZone = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
DateTime custDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, myZone);
Str.Append(custDateTime.ToString());
Ответ 3
Там очень простой способ сделать это. Просто получите текущее время UTC и ваш часовой пояс в двух разных переменных. Затем конвертируйте UTC в ваш часовой пояс в третью переменную и используйте его где угодно. Вот как ты это делаешь.
DateTime date1 = DateTime.UtcNow;
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Pakistan Standard Time");
DateTime date2 = TimeZoneInfo.ConvertTime(date1, tz);
Установите часовой пояс в tz и затем используйте "date2" в любом месте.
Ответ 4
У меня проблема с инструкцией:
TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
Итак... создаю личный TimeZoneInfo.
Здесь мой код...
public static DateTime DateNow()
{
DateTime utcTime = DateTime.UtcNow;
TimeZoneInfo myZone = TimeZoneInfo.CreateCustomTimeZone("COLOMBIA", new TimeSpan(-5, 0, 0), "Colombia", "Colombia");
DateTime custDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, myZone);
return custDateTime;
}
Ответ 5
Возникла похожая проблема (с часовыми поясами). В итоге я изменил некоторые типы баз данных с DateTime
на DateTimeOffset
(MSSql).
DateTimeOffset Struct
Написал расширение
public static class Extensions
{
public static DateTimeOffset ToCentralTime(this DateTimeOffset value)
{
return TimeZoneInfo.ConvertTime(value, TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"));
}
}
Пример использования:
public class ClockPunch
{
private DateTimeOffset dtoTimeIn;
private DateTimeOffset? dtoTimeOut;
public ClockPunch() { }
public DateTimeOffset TimeIn
{
get { return dtoTimeIn.ToCentralTime(); }
set { dtoTimeIn = value; }
}
public DateTimeOffset? TimeOut
{
get
{
DateTimeOffset? retVal = null;
if (dtoTimeOut != null)
{
retVal = ((DateTimeOffset)dtoTimeOut).ToCentralTime();
}
return retVal;
}
set { dtoTimeOut = value; }
}
}