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

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; }
    }
}
Другие вопросы по тегам