5

我们在中西部(东部标准时间)的服务器上启动并运行了一个 ASP.Net 2.0 Web 应用程序。此时,我们所有的客户都与服务器处于同一时区。我们将在亚利桑那州(山区标准时间)上线另一台服务器。

我们通过 C# 代码隐藏 DateTime.UtcNow 将所有时间存储在 SQL 2005 数据库中。

在测试过程中,我们遇到了一些时区转换问题。我们的问题是,在网络浏览器中,我们的时间显示的是山区标准时间,而不是我们正在测试的时区,即东部标准时间。

当我们输入新信息时,它会以 UTC 格式存储在数据库中,但是当我们在浏览器中查看该信息时,它会显示山区标准时间。下面是从数据库中获取 UTC 值并将其显示在浏览器中的代码。

lblUpdatedDate.Text = Convert.ToDateTime(dr["UpdatedDate"]).ToLocalTime().ToString();

上面的代码返回服务器所在的山区标准时间,而不是运行浏览器的东部标准时间。我们如何获得时间来显示用户的位置?

4

7 回答 7

6

我遇到过同样的问题。我们将我们的应用程序卖给了与 Web 服务器处于不同时区的用户。我们没有在 UTC 中存储任何时间信息,但它实际上工作正常。服务器时区显示的时间正好落后 3 小时。我们所要做的就是添加一个时区下拉列表,以便他们可以为整个站点选择他们的时区(因为应用程序的唯一用户将在他们的时区中)。我们保存了这个设置,然后插入了一个函数来获取所有日期时间显示并使用 TimeZoneInfo 命名空间从一个时区转换到另一个时区。它完美地工作。

于 2008-10-27T14:47:13.280 回答
3

到本地时间将始终在服务器端转换为物理位置。你有几个选择。

  1. 将 UTC 的偏移值存储到用户,保持 UTC 时间
  2. 通过 JS 进行客户端转换(我认为不优雅,也不合适)
  3. 查看一些MSDN 建议和 Timezone 命名空间
于 2008-10-27T14:40:16.413 回答
2

如果您使用的是 .NET 3.5并且您知道用户所在的时区,那么TimeZoneInfo是您的朋友。如果您不使用 .NET 3.5,则可以使用一些 P/Invoke 示例来获取TimeZone的实例,但如果您可以访问 3.5,则值得避免这样做。(TimeZoneInfo 有历史数据等,通常是首选方式。)

现在确定您的用户所在的时区是一个不同的问题 - 避免混淆的最简单方法是给他们选项。(“现在”获取偏移量只会为您提供有限的信息。)

于 2008-10-27T14:38:53.843 回答
2

在使用 ASP.NET 之前,我遇到过类似的情况。这是我的一般方法。

我发送 JavaScript 来执行 document.write。JavaScript 确定客户端与 GMT 的偏移量。所以你可以发送一个特定的时间,然后让 JavaScript 对其进行加/减。

于 2008-10-27T14:45:18.277 回答
1

始终将日期时间存储为 GMT 格式。

有2个步骤:

使用 Javascript 在客户端检测不同的时区:

var dt = new Date();
var diffInMinutes = -dt.getTimezoneOffset();

然后在服务器端,C# 代码根据上面检测到的时区偏移量将服务器时间转换为客户端时间:

string queryStr = Request.QueryString["diffInMinutes"];
int diffInMinutes = 0;
if (Int32.TryParse(queryStr, out diffInMinutes))
{
    clientTime = serverTime.ToUniversalTime().AddMinutes(diffInMinutes);
}
于 2015-04-27T09:14:50.817 回答
0

我们遇到了相同或类似的问题,远程客户端通过 Web 服务调用我们的数据库,其中数据库和客户端位于不同的时区。

我们发现指示数据集不关心时区是最简单的方法,这样时间就不会跨时区边界改变......

我们构建了一个实用方法 (SetAllDateModes),它按表转换数据集中的所有日期时间字段 - 这是业务端 (Foreach) 和设置 dateMode 的调用:

foreach (DataColumn dc in dt.Columns)
{
  if (dc.DataType == typeof(DateTime))
  {
    dc.DateTimeMode = dateMode;
  }
}
SetAllDateModes(dt, DataSetDateTime.Unspecified);

DateSetDateTime.Unspecified 不包括偏移量,因此没有转换。

于 2008-10-27T15:03:44.027 回答
0

我认为一般的想法是在向用户展示之前不要本地化日期和时间。因此,除非有人要阅读它,否则它会停留在 UTC、GMT、CUT 中。另一个注意事项使用日期/时间库,因此您不必担心夏令时时间更改问题。

于 2008-10-27T15:13:42.790 回答