【问题标题】:SimpleDateFormat localized month namesSimpleDateFormat 本地化月份名称
【发布时间】:2011-10-03 18:17:14
【问题描述】:

我已经在整个网站上进行了搜索,但我认为我的问题略有不同,并且在我心力衰竭或烧毁计算机之前确实需要一些帮助。

我动态生成月份名称列表(格式为 2011 年 6 月、2011 年 7 月),显然我希望它对区域设置敏感:因此我使用如下简单的日期格式对象:

//the actual locale name is dependent on UI selection
Locale localeObject=new Locale("pl"); 
// intended to return full month name - in local language.
DateFormat dtFormat = new SimpleDateFormat("MMMM yyyy",localeObject);
//this bit just sets up a calendar (used for other bits but here to illustrate the issue
String systemTimeZoneName = "GMT";
TimeZone systemTimeZone=TimeZone.getTimeZone(systemTimeZoneName);
Calendar mCal = new GregorianCalendar(systemTimeZone); //"gmt" time
mCal.getTime(); //current date and time

但如果我这样做:

String value=dtFormat.format(mCal.getTime()); 

这个“应该”返回月份名称的本地化版本。在波兰语中,“September”这个词是“Wrzesień”——注意 n 上的重音。但是我得到的只是“Wrzesie?”

我做错了什么?

谢谢大家 - 我现在接受这是一个演示问题 - 但我如何安全地“读取”来自 dtFormat 的结果 - 我使用 getBytes 等在 ref 下面添加了一些 cmets - 这在其他情况下有效,我只是可以' t 似乎可以访问字符串结果而不会弄乱它

-- 最终编辑;对于遇到此问题的任何人

答案在 BalusC 的博客上:http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html#DevelopmentEnvironment

基本上,DTformat 对象返回 UTF-8,当我将其读入字符串时,它会自动转换回系统默认字符集

所以这段代码对我有用

new String(dtFormat.format(mCal.getTime()).getBytes("UTF-8"),"ISO-8859-1");

非常感谢您的帮助

【问题讨论】:

  • 在这里工作正常。您的问题在演示文稿中。请编辑您的问题以包含有关此的更多详细信息。你到底是如何呈现它的?您使用的是什么 UI 技术?
  • k,目前我正在做一个简单的“System.out.println”,但是在 UI 中(所有这些都可以很好地显示波兰语字符)我在顶部使用 JSP 和 lang="pl" 在显示结果字符串的表单元素(选择列表)中。
  • 你可能会说我在 Java 知识方面是最低的;但是我在应用程序上的所有菜单等都可以在不同语言之间完美切换(手工编码,因此没有底层框架)
  • 另一个想法 - 对不起,当我完成一行时继续按回车...我尝试使用“new String(dtFormat.format(mCal.getTime()).getBytes("UTF-8")) &“ISO-8859-1”
  • 那么,您只是在标准输出中遇到问题(System.out.println() 最终出现在哪里),而不是在浏览器中 JSP 生成的 HTML 输出中遇到问题?标准输出连接到哪里?命令提示符控制台? IDE(Eclipse/Netbeans)控制台?日志文件?

标签: java localization simpledateformat


【解决方案1】:

您的问题与 SimpleDateFormat 无关 - 您只是对结果做错了事。

你还没有告诉我们你之后对字符串做了什么——你如何在 UI 中显示它——但是这就是的问题。您可以看到它正在获取本地化字符串;只有重音字符的显示会导致问题。如果你有一个包含相同重音字符的字符串常量,你会看到完全相同的东西。

如果它是一个 Web 应用程序,我建议你检查整个应用程序中使用的所有编码,或者如果它是一个控制台或 Swing 应用程序,则检查你显示字符串的字体。

如果您在调试器中检查字符串,我相信您会发现它有完全正确的字符 - 这正是它们到达用户的方式,这就是问题所在。

【讨论】:

  • 这条评论不适合对问题的真实评论吗?
  • @BalusC:不,它不会完成(超过 208 个字符) - 我相信它实际上会为 OP 的问题提供答案。我已经建议他们应该如何着手解决问题,所以我认为将其算作答案是合理的。
【解决方案2】:

在我的测试中,dtFormat.format(mCal.getTime()) 返回

październik 2011

new SimpleDateFormat(0,0,localeObject).format(mCal.getTime()) 返回:

poniedziałek, 3 październik 2011 14:26:53 EDT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多