DateTime.Now/UtcNow 默认文化 - 客户端还是服务器?

Posted

技术标签:

【中文标题】DateTime.Now/UtcNow 默认文化 - 客户端还是服务器?【英文标题】:DateTime.Now/UtcNow Default Culture - Client or Server? 【发布时间】:2014-08-19 17:53:27 【问题描述】:

我知道如何指定文化、日期格式、时区等...

我的问题是,当您在 C# 中键入 DateTime.Now 或 DateTime.UtcNow 时,它是使用运行服务器端代码的 Web 服务器的文化,还是使用客户端语言/文化发出请求的网络浏览器?

令我惊讶的是,从我的测试来看,这个服务器代码 DateTime.Now 似乎没有使用 Web 服务器的文化。但实际上是在网络浏览器中使用客户端 Lang/Cult!?

web.config 中是否有指定 DateTime.Now/UtcNow 默认在我的 Web 服务器的文化中运行?我只希望在专门为客户编写代码时应用客户文化。

【问题讨论】:

【参考方案1】:

DateTime.NowDateTime.UtcNow 根本没有任何 文化。只有当您将其格式化为字符串时,它才会使用一种文化……而使用哪种文化取决于您如何格式化它。为了在您的代码中清楚,只需明确指定文化,例如

string text = DateTime.UtcNow.ToString(CultureInfo.InvariantCulture);

但是,DateTime.Now 使用系统本地时区(即服务器上的时区)。这与用于格式化的文化是正交的。

【讨论】:

感谢乔恩的回复!但是,我不认为这是完全正确的。如果我的浏览器指定了 en-GB,则 DateTime.UtcNow 显示 19/8/2014,即使运行代码的 Web 服务器是 en-US,所以它应该是 2014 年 8 月 19 日。似乎 DateTime.Now/UtcNow 实际上应用了浏览器的客户端文化,而不是运行它的服务器系统。这不可能是正确的......只是在日期对象上单步调试。 @user2378631:不,您将DateTime.UtcNow 误认为是“我将DateTime.UtcNow 转换为字符串时得到的文本”。这些是不同的东西。 DateTime 值本身没有文化,也不是文本。 这只是单步调试日期对象的代码。 @user2378631:这就是调试器将值转换为字符串。它不是 DateTime 值本身固有的。 好的,默认情况下客户端设置会影响服务器代码似乎很奇怪。调试中的所有服务器端 DateTime 对象属性都反映了浏览器的客户端文化 en-GB (19/8/2014),即使 Web 服务器正在运行 en-US (8/19/2014)。 CultureInfo.CurrentCulture 还展示了 en-GB 的客户端文化。不是我所期望的......但我感谢你的帮助!【参考方案2】:

正如 Jon 所提到的,DateTime.UtcNow(或任何 DateTime)没有文化——它本质上是一个日期的 UInt64 表示,所以它只是一个数字。当它被转换为字符串以供显示(包括由您的调试器)时,就会应用一种文化。

为了解决浏览器文化设置如何影响服务器上的文化设置的问题,您是否可以在 web.config 的 globalization 部分或在页面指​​令(http://msdn.microsoft.com/en-us/library/vstudio/bz9tc508(v=vs.100).aspx)?

要让 ASP.NET 将 UI 文化和文化设置为当前浏览器设置中指定的第一种语言,请将 UICulture 和 Culture 设置为 auto。

【讨论】:

是的!你是对的,我将 web.config 从 auto 更改为 en-US,现在我的网站上一切正常。谢谢!这是一个很好的修复。

以上是关于DateTime.Now/UtcNow 默认文化 - 客户端还是服务器?的主要内容,如果未能解决你的问题,请参考以下文章

C#DateTime.Now precision

使用 ASPNETCore 1.1.1 本地化默认将当前文化设置为浏览器文化

如何找到文化的默认日期格式

c#:在 dotnet 类中是不是有一个属性可以说明“当前”文化是不是是实际的默认文化?

如何为整个 c# 应用程序设置默认文化信息

asp.net mvc 在哪里设置默认文化?