0

为了测试,Web 服务器位于具有Maori文化的计算机上,其中短日期格式如下:d/MM/yyyy.

用户在具有Hungarian文化的计算机上,短日期格式为yyyy.MM.dd.

我创建了一个网页,加载页面时将在标签上显示 DateTime.Now。显示的日期是2/18/2013 2:22:06 PM

所以现在我的问题是,为什么显示的日期是另一种格式/文化,我怀疑是英美?

其次,我需要将数据库中的日期(假设数据库位于具有不同文化的计算机上)与 DateTime.Now 进行比较。为此,我计划将数据库中的日期转换为与 Web 服务器的文化相匹配。但是考虑到我第一个问题的情况,我怎么知道 DateTime.Now 将采用哪种文化/格式?

编辑:使用的代码:

DateTime nowDateTime = DateTime.Now;
Label7.Text = nowDateTime.ToString().Trim();
4

4 回答 4

5

对于您问题的第一部分:您的代码基本上只是使用当前的线程文化。您可以确保将每个请求的当前线程文化设置为适合请求的文化(基于接受标头等 - 请参阅),或者您可以将其显式传递给对等HttpRequest.UserLanguages的所有调用。ToString

至于为什么它以美国英语格式出现 - 这很可能是网络服务运行的文化。这可能与桌面使用的文化不同。如果用户请求未提供任何信息,您应该努力确保使用它,除非可能作为后备。(我很想选择一个明确的后备而不是使用服务的默认值。)

其次,我需要将数据库中的日期(假设数据库位于具有不同文化的计算机上)与 DateTime.Now 进行比较。

使用DateTime.Now几乎可以肯定是一个坏主意。在大多数情况下,您应该DateTime.UtcNow在数据库中使用和存储 UTC 日期/时间。(在某些情况下,您应该存储本地时间和时区,但即使那样您也不会使用DateTime.Now.)

为此,我计划将数据库中的日期转换为与 Web 服务器的文化相匹配。但是考虑到我第一个问题的情况,我怎么知道 DateTime.Now 将采用哪种文化/格式?

在与字符串表示形式相互转换时,文化主要是相关的。在数据库中存储值或检索值时,应避免任何此类转换。相反,请确保您在数据库(DATETIME或其他)中使用了适当的字段类型,然后在数据访问层中将其作为 a获取。DateTime如果您发现自己试图使用DateTime.Parse或类似的东西,那应该敲响警钟。您还没有告诉我们您正在使用什么数据访问技术,但几乎所有内容都允许您DateTime直接检索 a。(例如DbDataReader.GetDateTime。)

于 2013-02-18T06:51:05.777 回答
2

在比较不同时区的日期时,将其作为 UTC 存储在数据库中是有意义的。然后,您可以轻松地将其与任何时区的任何其他日期进行比较(再次转换为 UTC)。

希望这可以帮助。

于 2013-02-18T06:44:19.203 回答
1

根据您的编辑,我认为相关主题上的文化并不是真正的毛利人。试试这个来测试:

Label7.Text = CultureInfo.CurrentCulture.ToString();

如果是"mi""mi-NZ",那就是毛利人。有的东西"en"会是英语、"hu"匈牙利语等等。

请注意,如果以编程方式更改当前区域性,则这只影响当前线程。不是其他线程。但是您是否尝试在 Windows 的控制面板中设置区域设置?

于 2013-02-18T07:19:27.057 回答
0

为什么显示的日期是另一种格式/文化,我怀疑是 Eng-US?

答:标签上的DateTime.Now呈现已经是英语文化,这可能是由于当前的 Web 服务器配置或它正在选择用户的请求文化。2/18/2013 2:22:06 PMMaori

可能的解决方案: 将其呈现在客户的文化中,即匈牙利文化

  1. 最简单和框架句柄,修改配置以适应用户的请求头
  2. 手动,您需要为此编写代码,您需要处理Page'InitializeCulture事件并根据用户的请求标题更改Culture执行,这应该类似于HttpRequestAccept-LanguageAccept-Language: hu-HU,en;q=0.8

以上 1 点的代码示例

<system.web>
       <globalization
                  enableclientbasedculture="true"
                  uiculture="auto"
                  culture="auto">
       </globalization>
</system.web>

为此,请参阅Scott Hanselman 的关于全球化的帖子,其中也可以将哪个概念应用于 Web 表单应用程序。

要读取数据库值,请使用代码片段,

var culture = CultureInfo.CreateSpecificCulture("mi-NZ");
DateTime.Parse(sqlDbReader["MyDateColumnName"], culture)

参考:Format SqlDataReader as date and MSDN - DateTime.Parse Method

于 2013-02-18T07:34:00.730 回答