C# 如何在ASP.NET MVC中创建时区?

C# 如何在ASP.NET MVC中创建时区?,c#,asp.net,asp.net-mvc,timezone,C#,Asp.net,Asp.net Mvc,Timezone,在我的网站上,我需要知道人们所在的时区,以便在正确的时间向他们显示消息。我不太确定在如何做这方面的教程方面要搜索什么 我计划做的是:当用户来到我的网站时,他们会通过从下拉列表中选择来设置时区。我将把他们的设置存储在我的数据库中,并用它来计算时间 我不确定我需要什么。我的数据库时间应该存储什么?我在某处读到它应该存储为UTC。如何设置数据库以执行此操作?此外,我将在一个共享托管网站,所以它必须以一种我可以做到的方式设置(可能通过webconfig?) 接下来,我需要一个所有时区的列表作为HTML助

在我的网站上,我需要知道人们所在的时区,以便在正确的时间向他们显示消息。我不太确定在如何做这方面的教程方面要搜索什么

我计划做的是:当用户来到我的网站时,他们会通过从下拉列表中选择来设置时区。我将把他们的设置存储在我的数据库中,并用它来计算时间

我不确定我需要什么。我的数据库时间应该存储什么?我在某处读到它应该存储为UTC。如何设置数据库以执行此操作?此外,我将在一个共享托管网站,所以它必须以一种我可以做到的方式设置(可能通过webconfig?)

接下来,我需要一个所有时区的列表作为HTML助手或常规HTML。我真的不想做一个


然后,就像我说的,我需要一个教程告诉我该怎么做。我认为这是在增加和减少时间,但我可能错了。

为此,您肯定应该在数据库中以UTC格式存储时间戳

当您需要显示站点数据库中的日期时,可以执行以下操作:

DateTime stamp = /* get datetime from the database here, make sure you
                    use the constructor that allows you to specify the 
                    DateTimeKind as UTC. */

//E.g.
//DateTime stamp = new DateTime(2009, 12, 12, 12, 12, 12, DateTimeKind.Utc);

timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(" /* users time zone here */"); 
var convertedTime = TimeZoneInfo.ConvertTime(stamp, timeZoneInfo);

//Print out the date and time
//Console.WriteLine(convertedTime.ToString("yyyy-MM-dd HH-mm-ss")); 

时区列表已在.Net中提供,因此您可以看到。对于ASP.Net MVC,您不需要打印超时,而是希望将转换后的datetime分配给模型类的属性,以便视图可以使用它进行显示。

首先,查看MSDN中的datetime文档并阅读它。关于涵盖时区和UTC的DateTime最佳实践


是的,您应该在数据库中存储UTC。将DateTimes存储为UTC将允许您根据用户选择的时区向用户转换时间(或从用户转换时间)。你在正确的轨道上

我无法强调使用UTC存储和处理您编写的任何应用程序的重要性。即使您知道应用程序将只在单个时区中使用,但由于夏令时问题,使用UTC比使用本地时区要容易得多

在数据库级别,您确实不需要做什么特殊的事情。只需创建一个普通的datetime列,但要确保清楚地记录该列被假定为UTC

老实说,asp.net不是我的专长,但我认为您可以通过某种方式从客户端请求中获取时区。实际上,由于夏令时规则可能非常模糊,取决于地区,因此最好使用java脚本计算UTC偏移量并使用该偏移量进行转换。即使在2005年《能源政策法案》之后,DST规则仍有一些例外情况,在服务器端很难处理。但是,我认为您的想法是允许客户端设置自己的时区,这在大多数情况下都能很好地工作。

使用

getCurrentDateTimeWithTimeZone("Central Europe Standard Time");
方法

public DateTime getCurrentDateTimeWithTimeZone(string strTimeZone)
    {
        var localTimezone = TimeZoneInfo.Local;
        var userTimezone = TimeZoneInfo.FindSystemTimeZoneById(strTimeZone);

        var todayDate = DateTime.Now;
        var todayLocal = new DateTimeOffset(todayDate,
                                            localTimezone.GetUtcOffset(todayDate));

        var todayUserOffset = TimeZoneInfo.ConvertTime(todayLocal, userTimezone);
        return todayUserOffset.DateTime;

    }
时区ID列表

日期线标准时间

UTC-11

萨摩亚标准时间

夏威夷标准时间

阿拉斯加标准时间

太平洋标准时间(墨西哥)

太平洋标准时间

美国山地标准时间

山区标准时间(墨西哥)

山区标准时间

中美洲标准时间

中央标准时间

中央标准时间(墨西哥)

加拿大中央标准时间

南太平洋标准时间

东部标准时间

美国东部标准时间

委内瑞拉标准时间

巴拉圭标准时间

大西洋标准时间

巴西中部标准时间

南非西部标准时间

太平洋标准时间

纽芬兰标准时间

E.南美洲标准时间

阿根廷标准时间

南非东部标准时间

格陵兰标准时间

蒙得维的亚标准时间

UTC-02

大西洋中部标准时间

亚速尔群岛标准时间

佛得角标准时间

摩洛哥标准时间

UTC

格林尼治标准时间

格林威治标准时间

W.欧洲标准时间

中欧标准时间

浪漫标准时间

中欧标准时间

W.中部非洲标准时间

纳米比亚标准时间

约旦标准时间

GTB标准时间

中东标准时间

埃及标准时间

叙利亚标准时间

南非标准时间

标准时间

以色列标准时间

E.欧洲标准时间

阿拉伯标准时间

阿拉伯标准时间

俄罗斯标准时间

E.非洲标准时间

伊朗标准时间

阿拉伯标准时间

阿塞拜疆标准时间

毛里求斯标准时间

格鲁吉亚标准时间

高加索标准时间

阿富汗标准时间

叶卡捷琳堡标准时间

巴基斯坦标准时间

西亚标准时间

印度标准时间

斯里兰卡标准时间

尼泊尔标准时间

中亚标准时间

孟加拉国标准时间

N.中亚标准时间

缅甸标准时间

东南亚标准时间

北亚标准时间

中国标准时间

东北亚标准时间

新加坡标准时间

W.澳大利亚标准时间

台北标准时间

乌兰巴托标准时间

东京标准时间

韩国标准时间

雅库茨克标准时间

岑。澳大利亚标准时间

澳大利亚中央标准时间

E.澳大利亚标准时间

澳大利亚东部标准时间

西太平洋标准时间

塔斯马尼亚标准时间

符拉迪沃斯托克标准时间

中太平洋标准时间

新西兰标准时间

UTC+12

斐济标准时间

堪察加半岛标准时间

汤加标准时间


嗨,谢谢,我将开始尝试实现这一点。我有另一个