Как изменить часовой пояс для приложения 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; }
    }
}