根据文化显示正确的日期格式
Posted
技术标签:
【中文标题】根据文化显示正确的日期格式【英文标题】:Displaying proper date format depending on culture 【发布时间】:2009-04-30 21:05:46 【问题描述】:我正在使用一个弹出日历日期选择器的控件。这使用 javascript 函数 SetText 将文本框设置为给定日期。我无法更改日历控件本身的任何内容,但我可以覆盖 SetText 函数。 SetText javascript 只采用字符串格式的 TextBox 名称和日期值,并将 TextBox 设置为字符串。
问题: 我需要以“4 月 30 日”的格式显示日期。
很容易做到。使用 getMonth() 和 getDate() 我可以从那里解析信息。
现在,我需要确保它针对不同的文化正确显示。例如,英国将日期显示为“4 月 30 日”。由于代码隐藏(c#)可能以英国格式发送日期,我如何在 javascript 中知道他们使用的是英国(dd/mm/yyyy)而不是美国(mm/dd/yyyy)? 浏览器导航器语言可能设置为一种设置,而服务器设置为另一种设置,从而导致 1 月 4 日与 4 月 1 日不匹配。
【问题讨论】:
这并不完全是一个答案,但 dojo JS 库有一个出色的日期本地化包:api.dojotoolkit.org/jsdoc/1.3/dojo.date.locale.format Datejs 库包含大量日期函数,可让您格式化和解析各种格式的日期并使用日期格式字符串。 datejs.com 【参考方案1】:您正在使用 Microsoft Ajax 框架,该框架定义了一组“client-side type extensions”,它们为 JavaScript 基本类型提供了附加功能或“扩展”。
Date Type Extensions 就是您要查找的内容,特别是 Date.parseLocale function。
使用此函数,您可以使用给定格式解析字符串。
您可以通过将 ScriptManager.EnableScriptGlobalization 属性设置为 true 来同步服务器端和客户端文化,并使用 Date.parseLocale 函数而不指定任何格式。
看看这篇文章:
Walkthrough: Globalizing a Date by Using Client Script【讨论】:
【参考方案2】:见toLocaleString及相关功能。
【讨论】:
但这给出了“2009 年 4 月 30 日星期四下午 4:57:00”我可以将前面和后面的字符串剪断,但它不会总是在后面是年份和时间会吗?我以前研究过这个,但没有找到答案 toLocaleDateString 至少让你更接近。我还应该指出,语言环境差异实际上仅在数字日期中普遍存在(11/22/09 可能是 11 月 12 日或 12 月 11 日),但是当您使用月份名称或缩写时,任何地方的含义都应该很清楚。【参考方案3】:如果您控制后端,为什么不直接发送时间戳并将其推送到 Date
对象中?
关于客户端的格式化,由于我已经在使用Dojo,所以我使用dojo.date.locale.format
解决了这个问题。这是完全无痛的。
教程:http://docs.dojocampus.org/dojo/date/locale API文档: http://api.dojotoolkit.org/jsdoc/1.3/dojo.date.locale.format 日期格式说明:http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns
【讨论】:
【参考方案4】:你可以使用的三样东西:
1) toLocaleString - 正如已经建议的那样。问题是当发送“2009 年 4 月 1 日”的字符串时,这可能会导致几件事。 1 月 4 日或 4 月 1 日。
2) navigator.language 和navigator.systemLanguage - 获得日期字符串后,您可以检查系统使用的语言并从那里解析日期。这个问题和解决方案 1 的问题是,如果您有一台英国服务器并且浏览器机器是美国的。您将拥有将 4 月 1 日作为 2009 年 1 月 4 日发送的代码,其中 javascript 会将字符串读取为客户端浏览器的任何语言。所以,英国服务器和美国浏览器会给你一个错误的结果。
3) 使用代码背后的文化 - 在您的 javascript 中创建一个变量,当页面加载时,它将在您的代码中调用一个函数,从那里返回 this.Page.Culture
,您将知道该字符串被发送回的文化作为。这将消除前两种解决方案可能导致的不匹配。确保它正确显示需要一些额外的工作,但至少您将能够使用该字符串而不会出现文化不匹配的可能性。
【讨论】:
【参考方案5】:toLocaleDateString 会比toLocaleString 更好地解决您的问题,因为它不包括时间(因为您只是请求日期)。
【讨论】:
【参考方案6】:开源 JavaScript 库 Date.js 有一些很好的格式化日期的方法,并且它支持多种语言:
Google 代码中的 Date.js:http://code.google.com/p/datejs/
如果您想要格式良好的日期/时间,您可以将 a formatting string(几乎与 .NET Framework 中使用的相同)传递给任何 Date 对象的 .toString()
方法。
它还有一整套文化,让您可以简单地包含适合该文化的脚本。
如果您想自己管理(就像我们在应用程序中所做的那样),您可以找到资源,这些资源会为您提供给定文化的适当资源字符串列表。这是一个显示大量文化的正确格式字符串:http://www.transactor.com/misc/ranges.html
【讨论】:
【参考方案7】:当您使用 ASP.NET 时,您也可能使用 ASP.NET Ajax。如果是这样,ScriptManager 上有两个属性对您有用:
EnableScriptLocalization - 获取或设置一个值,该值指示 ScriptManager 控件是否呈现脚本文件的本地化版本。
EnableScriptGlobalization - 获取或设置一个值,该值指示 ScriptManager 控件是否呈现支持解析和格式化特定区域性信息的脚本。
<asp:ScriptManager ID="AjaxManager" runat="Server" EnablePartialRendering="true"
EnableScriptGlobalization="true" EnableScriptLocalization="true" />
当您同时启用这两个(设置为 true)时,ASP.NET Ajax 扩展程序等应自动本地化为 web.config 中指定的文化:
<configuration>
<system.web>
<globalization
fileEncoding="utf-8"
requestEncoding="utf-8"
responseEncoding="utf-8"
culture="en-GB"
uiCulture="en-GB" />
</system.web>
</configuration>
例如,设置此项会将AjaxControlToolkit Calendar 本地化为您的特定文化。
即使您不使用 ASP.NET Ajax,添加 ScriptManager 并启用本地化也会为您提供一个名为 __cultureInfo
的有用 javascript 变量,其中包含本地化格式的 JSON 数组,例如货币、日期等。
"CalendarType":1,"Eras":[1],"TwoDigitYearMax":2029,"IsReadOnly":true,"DateSeparator":"/","FirstDayOfWeek":1,"CalendarWeekRule":0,"FullDateTimePattern":"dd MMMM yyyy HH:mm:ss","LongDatePattern":"dd MMMM yyyy","LongTimePattern":"HH:mm:ss","MonthDayPattern":"dd MMMM","PMDesignator":"PM","RFC1123Pattern":"ddd, dd MMM yyyy HH\u0027:\u0027mm\u0027:\u0027ss etc....
【讨论】:
【参考方案8】:我通过使用 Datejs 解决了这个问题
在 codebehind(aspx.cs) 中,我获取了员工的文化,并将适当的 js 添加到标题中字符串路径 = “http://datejs.googlecode.com/svn/trunk/build/date-” + GetCulture() + ".js"; Helper.AddJavaScript(this, path);
(在您的情况下,您可以从 navigator.systemLanguage(或 navigator.browserLanguge 等)获取文化,并将脚本标签添加到标头,并使用 src 属性指向适当的路径)
在我使用的客户端d.toString(Date.CultureInfo.formatPatterns.shortDate)
其中 d 是任何日期对象 (我尝试使用 Date.today().toShortDateString() 但它抛出异常。(CultureInfo JSON 对象的结构与函数预期的不同)。
【讨论】:
以上是关于根据文化显示正确的日期格式的主要内容,如果未能解决你的问题,请参考以下文章