如何在ASP.NET MVC中做时区?

问题描述 投票:39回答:4

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

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

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

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

然后,就像我说的,我需要一个教程,告诉我该怎么做。我认为这是从那时起添加和减去的东西,但我可能是错的。

c# asp.net asp.net-mvc timezone
4个回答
36
投票

为此,您绝对应该将您的时间戳以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中提供,因此您可以看到this post on how to enumerate them。对于ASP.Net MVC,您不希望打印超时,而是希望将转换后的日期时间分配给模型类的属性,以便View可以将其用于显示。


9
投票

我不能强调使用UTC存储和处理您编写的任何应用程序的重要性。即使您知道应用程序将仅在单个时区中使用,因此夏令时问题仍然比使用本地时区更容易使用UTC。

在数据库级别,您真的没什么需要做的。只需创建一个普通的日期时间列,但要确保明确记录该列是否为UTC。

老实说,asp.net不是我的专长,但我想你可以从客户端请求中获取时区。实际上,因为夏令时规则可能非常模糊,具体取决于区域,使用计算UTC偏移量的java脚本并使用它来进行转换可能更好。即使在2005年的能源政策法案之后,仍然存在一些DST规则的例外情况,这些规则在服务器端很难处理。但是,我认为你想让客户设置自己的时区在大多数情况下都能正常运行。


2
投票

首先,检查MSDN的DateTime文档并阅读它。 Here is an article关于DateTime的最佳实践,涵盖时区和UTC。

是的,您应该将UTC存储在数据库中。将DateTimes存储为UTC将允许您根据所选时区将时间转换为(和来自)用户。你走在正确的轨道上!


0
投票

用法

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

萨摩亚标准时间

夏威夷标准时间

阿拉斯加标准时间

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

太平洋标准时间

美国山地标准时间

山地标准时间(墨西哥)

山地标准时间

中美洲标准时间

中央标准时间

中央标准时间(墨西哥)

加拿大中央标准时间

在太平洋标准时间

东部标准时间

美国东部标准时间

委内瑞拉标准时间

巴拉圭标准时间

大西洋标准时间

巴西中部标准时间

SA西部标准时间

Pacific SA标准时间

纽芬兰标准时间

E.南美标准时间

阿根廷标准时间

SA东部标准时间

格陵兰标准时间

蒙得维的亚标准时间

UTC-02

大西洋中部标准时间

亚速尔群岛标准时间

佛得角标准时间

摩洛哥标准时间

世界标准时间

GMT标准时间

格林威治标准时间

W.欧洲标准时间

中欧标准时间

浪漫标准时间

中欧标准时间

W.中非标准时间

纳米比亚标准时间

约旦标准时间

GTB标准时间

中东标准时间

埃及标准时间

叙利亚标准时间

南非标准时间

FLE标准时间

以色列标准时间

E.欧洲标准时间

阿拉伯标准时间

阿拉伯标准时间

俄罗斯标准时间

E.非洲标准时间

伊朗标准时间

阿拉伯标准时间

阿塞拜疆标准时间

毛里求斯标准时间

格鲁吉亚标准时间

高加索标准时间

阿富汗标准时间

叶卡捷琳堡标准时间

巴基斯坦标准时间

西亚标准时间

印度标准时间

斯里兰卡标准时间

尼泊尔标准时间

中亚标准时间

孟加拉国标准时间

N.中亚标准时间

缅甸标准时间

东南亚标准时间

北亚标准时间

中国标准时间

北亚东部标准时间

新加坡标准时间

W.澳大利亚标准时间

台北标准时间

乌兰巴托标准时间

东京标准时间

韩国标准时间

雅库茨克标准时间

岑。澳大利亚标准时间

关闭中央标准时间

E.澳大利亚标准时间

AUS东部标准时间

西太平洋标准时间

塔斯马尼亚标准时间

符拉迪沃斯托克标准时间

中太平洋标准时间

新西兰标准时间

UTC + 12

斐济标准时间

堪察加标准时间

汤加标准时间

© www.soinside.com 2019 - 2024. All rights reserved.