【问题标题】:How do I determine the user's culture on the web, based on their time zone?如何根据时区确定用户在网络上的文化?
【发布时间】:2023-03-14 10:35:01
【问题描述】:

这里是新手。实际上,这是有史以来的第一个问题。

我一直在使用 NodaTime(在 ASP.Net MVC 3 C# 上)来绕过不同的时区,并且对结果非常满意。 但... 我想知道是否有办法根据时区获取用户的文化信息 - 即:显示日期/时间。

提前感谢您的帮助!

更新

让我更清楚一点...

我能够使用 jsTimeZoneDetect 和 NodaTime 确定用户时区。它运行良好。 现在,我需要找出用户区域设置信息(日期/时间格式等),以便能够正确显示这些信息。即:基于美国的用户将看到日期为 2013 年 3 月 21 日。

我尝试从 Request.UserLanguages 获取语言环境,但无济于事。 IE 正确返回我的语言环境(en-GB),但 Firefox 和 Chrome 总是返回 en-US。 我还更改了 web.config 并添加了以下元素:

<globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true" />

这就是我一直在处理的代码:

var userLanguages = Request.UserLanguages;

CultureInfo ci;

if (userLanguages.Length > 0)
{
    try
    {
        ci = new CultureInfo(userLanguages[0]);
    }
    catch (CultureNotFoundException)
    {
        ci = CultureInfo.InvariantCulture;
    }
}
else
{
    ci = CultureInfo.InvariantCulture;
}

string cultureName = ci.Name /* Always returns en-US */

另外一点,要求用户选择他们的语言环境信息对我来说不是一个选项。即:网站上的DropdownList等

还有什么帮助吗?提前致谢。

更新 2

根据@JonSkeet 的建议,我更改了问题标题和标签以更好地适应我的问题。

更新 3

刚刚发现了一些东西。返回语言(locale)的方式,取决于浏览器,如下:

  • Internet Explorer 返回在操作系统设置或浏览器设置中设置的语言。
  • Firefox、Chrome、Safari 和 Opera 返回浏览器设置中设置的语言。

考虑到这一点,我什至无法考虑使用这些信息,因为无法保证每个用户都会更改他们的浏览器设置。我唯一可以依赖的信息是来自操作系统设置的信息。

我不知道现在该做什么。

【问题讨论】:

  • 你如何让用户的时区开始?我希望通过 HTTP 请求信息更容易获得文化。
  • 时区确实不够精细,无法确定文化。有几个时区包含多种文化类型。

标签: asp.net-mvc-3 timezone cultureinfo datetime-format


【解决方案1】:

无论要求如何澄清,都按要求回答问题...

在 1.0 中,我们没有任何可用的地理信息。在 1.1 中,我们公开了来自 zoneinfo.tab 的信息,它将位置与包括国家/地区在内的每个时区(或至少大部分时区)相关联。它没有提供完整的文化信息(例如,它不区分法语加拿大语和英语加拿大语,或瑞士使用的各种语言),但它为您提供了一些的想法。您可以通过TzdbDateTimeZoneSource.GeoLocations 访问这些信息。 (仅适用于 TZDB。)

当然,1.1 还没有发布 - 但我们希望在接下来的几周内发布,几乎可以肯定没有任何大的 API 更改。

我仍然建议通过 HTTP 请求正常检测文化。

【讨论】:

  • 嗨@JonSkeet。感谢您的快速回复。这是一段代码:code var zone1 = tzdb["UTC"]; var ldt1 = new LocalDateTime(2013, 3 20, 8, 0); var zdt1 = zone1.AtLeniently(ldt1); var zone2 = tzdb["America/Los_Angeles"]; var zdt2 = zdt1.ToInstant().InZone(zone2); var ldt2 = zdt2.LocalDateTime; code
  • @MelanciaUK:虽然不清楚该代码与您的问题有什么关系......该代码根本不使用文化,也没有解释您如何推断用户的时间区域。
  • 我现在需要的唯一信息是日期/时间格式。将研究您指出的 HTTP 请求。干杯
  • 知道了。应该是:code Console.Write(ldt2.ToString(null, new CultureInfo("en-US"))); code
  • @MelanciaUK:例如见mikehadlow.blogspot.co.uk/2010/11/…
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多