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.Now
和DateTime.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 默认文化 - 客户端还是服务器?的主要内容,如果未能解决你的问题,请参考以下文章
使用 ASPNETCore 1.1.1 本地化默认将当前文化设置为浏览器文化