Как изменить часовой пояс для приложения asp.net
Мне нужно установить часовой пояс по умолчанию для моего ASP.NET на Азия / Дакка или часовой пояс GMT+6. Но я не могу найти способ изменить это глобально. Существует множество ссылок на Stackru и остальную часть Интернета, чтобы сделать это, получая информацию о часовом поясе и вычисляя правильное время каждый раз, когда мне нужен объект DateTime.
Но поверь мне, я не хочу делать это таким образом. Так что не предлагайте мне никаких предложений. Я хочу установить часовой пояс в Азия / Дакка или GMT+6, предпочтительно из web.config. (То же самое мы делаем в php с php.ini). Так что каждый раз, когда мне нужен объект DateTime, время оценивается с моим часовым поясом, независимо от того, какой часовой пояс для сервера.
Это возможно? Если возможно то как?? Заранее спасибо за решение:)
4 ответа
Извините, в.NET нет способа изменить часовой пояс глобально.
Единственный способ - изменить часовой пояс вашего сервера или переписать весь ваш код.
Лучше всего вообще не полагаться на часовой пояс системы (никогда не используйте DateTime.Now).
Все даты должны обрабатываться как даты Utc, а затем преобразовываться в определенную зону при отображении их пользователям.
Даже если вам удастся обработать часовые пояса в приложении ASP.NET, на SQL Server все еще есть часовые пояса, например функция GETTIME. Если ваше приложение полностью написано в формате UTC, функция SQL-сервера также будет работать.
Есть очень простой способ сделать это. Просто получите текущее время UTC и ваш часовой пояс. Конвертировать UTC в ваш часовой пояс. Вот как ты это делаешь.
DateTime date1 = DateTime.UtcNow;
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Pakistan Standard Time");
DateTime date2 = TimeZoneInfo.ConvertTime(date1, tz);
Установите часовой пояс в tz, а затем используйте "date2" в любом месте.
У меня проблема с инструкцией:
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;
}
Вы можете изменить часовой пояс... и получить дату
DateTime utcTime = DateTime.UtcNow;
TimeZoneInfo myZone = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
DateTime custDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, myZone);
Str.Append(custDateTime.ToString());
Лучше было бы создать customTimeZone
public static DateTime DateNow()
{
DateTime utcTime = DateTime.UtcNow;
TimeZoneInfo myZone = TimeZoneInfo.CreateCustomTimeZone("INDIA", new TimeSpan(+5, +30, 0), "India", "India");
DateTime custDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, myZone);
return custDateTime;
}
Возникла похожая проблема (с часовыми поясами). В итоге я изменил некоторые типы баз данных с DateTime
в DateTimeOffset
(MSSql).
Написал расширение
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; }
}
}