1

我从休息服务中获得了 XMLGregorianCalendar。我需要根据语言本地化月份。我读过本地化日期的最佳方法是使用 SimpleDateFormat 类。问题是我不确定如何将 XMLGregorianCalendar 转换为 SimpleDateFormat。转换不起作用,我能得到的最接近的是XMLGregorianCalendar.toGregorianCalendar.getTime() 返回日期,但我找不到将日期转换为 SimpleDateFormat 类型的方法。有任何想法吗?

-编辑- 我喜欢 SimpleDateFormat 的原因是因为我可以使用 ISO 639-1 代码列表 ( http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes ),这是我从上下文中得到的。

4

2 回答 2

3

你不能那样做。SimpleDateFormat是一个可以从字符串解析日期并将日期格式化为字符串的对象。但是,一个Date对象保存着具有给定时间点意义的数据,则完全不同。

但是,您可以使用SimpleDateFormat将日期转换为字符串:

SimpleDateFormat sdf  = new SimpleDateFormat("YYYY-MMM-dd", myLocaleInstance);
System.out.println(sdf.format(myXMLGregorianCalendarInstance));

您只需组装格式字符串,并获取Locale实例(例如从语言代码中)。

经验法则

  • 依赖默认语言环境可能意味着大麻烦!(虽然这里不相关,但同样适用于默认编码)
  • Date没有时区信息,而Calendar有。必须始终牢记这一点,尤其是在处理 Web 服务、提供和使用来自世界各地的数据时......
  • 我个人最喜欢的,略有不同,但可能很难看:在日历中,MONTHs 从 0 开始索引。因此,正如 jarnbjo 所说,编号为 12 的月份不是 12 月...
  • 格式化对象通常不是线程安全的。在静态变量中使用它们是一种难闻的气味!DecimalFormat 也是如此。
于 2013-09-11T17:11:46.267 回答
2

首先,您应该将XMLGregorianCalendar实例转换为对象并为所需的语言Date创建一个对象:Locale

Date date = xmlCalendar.toGregorianCalendar().getTime();        
Locale locale = new Locale("es");

然后,您可以使用SimpleDateFormat以获取指定语言的月份名称:

SimpleDateFormat sdf = new SimpleDateFormat("MMMM", locale);        
System.out.println(sdf.format(date));

将输出:septiembre

或者,您可以获得本地化的日期格式化程序,以使用指定的语言输出整个日期:

System.out.println(DateFormat.getDateInstance(DateFormat.LONG, locale).format(date));

将输出:2013 年 9 月 11 日

于 2013-09-11T17:24:53.993 回答