如何更改asp.net应用程序的时区

时间:2011-12-21 11:22:43

标签: c# asp.net datetime

我需要将ASP.NET的默认时区设置为亚洲/达卡或GMT + 6时区。但我找不到全球改变它的方法。 Stackoverflow和Web的其余部分有很多参考,通过获取时区信息并计算每次需要DateTime对象的正确时间。

但请相信我,我不想这样做。所以不要给我这样的建议。我想将时区设置为亚洲/达卡或GMT + 6,最好是从web.config。 (类似我们在php中使用php.ini)所以每次我需要DateTime对象时,无论服务器的时区是什么,时间都用我的时区进行评估。

这可能吗?如果可能的话怎么样? 在此先感谢您的解决方案:)

6 个答案:

答案 0 :(得分:9)

很抱歉,.NET无法全局更改时区。

唯一的方法是更改​​服务器的时区或重写所有代码。

最佳做法是完全不依赖系统时区(永远不要使用DateTime.Now)。

您应该将所有日期作为Utc日期处理,然后在向用户显示时转换为特定区域。

即使您设法在ASP.NET应用程序中处理时区,SQL Server上仍然存在时区,例如GETTIME功能。如果您的应用程序完全用UTC编写,那么您的SQL服务器功能也可以正常工作。

答案 1 :(得分:3)

您可以更改TimeZone ...并获取日期

 DateTime utcTime = DateTime.UtcNow;
    TimeZoneInfo myZone = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
    DateTime custDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, myZone);
    Str.Append(custDateTime.ToString());

答案 2 :(得分:3)

有一个很简单的方法来做到这一点。只需获取当前UTC时间和您的时区即可。将UTC转换为您的时区。这是您的操作方式。

DateTime date1 = DateTime.UtcNow;

TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Pakistan Standard Time");

DateTime date2 = TimeZoneInfo.ConvertTime(date1, tz);

以tz为单位设置时区,然后在任何地方使用“ date2”。

答案 3 :(得分:2)

我的说明有问题:

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;   
        }

答案 4 :(得分:0)

遇到类似的问题(带有时区),我最终将某些数据库类型从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; }
    }
}

答案 5 :(得分:0)

最好是创建一个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;
        }