jodatime DateTime 对象和语言环境

Posted

技术标签:

【中文标题】jodatime DateTime 对象和语言环境【英文标题】:jodatime DateTime objects and Locale 【发布时间】:2011-12-14 16:55:50 【问题描述】:

鉴于此字段语言环境已设置为挪威 bokmål 和挪威:

Locale locale = new Locale("nb","no"); 

在为语言 bokmål 返回正确字符串的方法中,此代码片段缺少什么?

Assert.assertNotNull(locale);//Is asserted
MutableDateTime start = new MutableDateTime(2012,1, 10,10,0,0,0 );
start.setDayOfWeek(DateTimeConstants.SATURDAY);
System.out.println(start.dayOfWeek().getAsText(locale));
System.out.println(locale.getISO3Language().toString());

输出是“星期六,nob” 我是否需要自己实现特定于语言环境的工作日名称字符串?如果是这样,是否有一些基础对象或接口可以在 jodatime 中覆盖?我好像找不到。

【问题讨论】:

您的nb_NO 区域设置可用吗? docs.oracle.com/javase/tutorial/i18n/locale/identify.html 您使用MutableDateTime 有什么特别的原因吗?我的代码打印出我只能假设是适当的翻译:“lørdag”-您确定语言环境正在正确设置/传入吗? 不,我必须进一步调查语言环境。您链接的 Oracle 页面中的此代码仅呈现非常奇怪的“be ar”: public class AvailableLocales static public void main(String[] args) Locale list[] = DateFormat.getAvailableLocales(); for (Locale aLocale : list) System.out.println(aLocale.toString()); 我只使用 MutableDateTime,因为我正在根据周选择逐步修改日期,并且似乎没有必要在方法内复制一系列不可变值对象。 请注意,简短的语言环境列表“be, ar”使用的是 openjdk,而不是 Apple jdk1.5。 【参考方案1】:

您的代码对我来说可以正常工作:

[system:/tmp]$ cat Loc.java
import org.joda.time.*;
import java.util.Locale;

class Loc 
    public static void main(String[] args) 
        Locale locale = new Locale("nb","no");
        MutableDateTime start = new MutableDateTime(2012,1, 10,10,0,0,0 );
        start.setDayOfWeek(DateTimeConstants.SATURDAY);
        System.out.println(start.dayOfWeek().getAsText(locale));
        System.out.println(locale.getISO3Language().toString());
    

[system:/tmp]$ java Loc
lørdag
nob

有几件事可以尝试:

尝试使用new Locale("nb", "NO")(国家/地区为supposed to be case-insentive,但值得一试) 尝试使用new Locale("no", "NO")new Locale("nn", "NO") - Nyorsk 可能不是您想要的,但它有效吗?从一些谷歌搜索来看,似乎某些平台可能会将nb_NO 视为no_NO 的别名?知道这是否有效可能很有用。 确保nb_NO 区域设置为available。这可能是因为getISO3Language() 似乎有效。

【讨论】:

感谢您的试驾和参考。我会尝试你的建议并报告。 您对 Oracle 链接的友好回复让我走上了正轨。我开始怀疑我使用的 openjdk7 端口不完整,并在获取所有可用语言环境时仅使用“ar”和“be”来证明这一点,并将我的项目更改为 Apples 提供的 jdk1.5。 “no_NO”仍然无法正常工作,并给了我瑞典语的工作日(我的系统设置为瑞典语)。 Apples jdk1.5 的正确代码至少是“不”。这给了我与你相似的结果: "lørdag nor" 。谢谢! 我希望 Rob 上面的回答在大多数情况下都是正确的,但对于 Apples jdk1.5 从 OS X 10.5.8 开始只有“没有”给出了我正在寻找的结果。

以上是关于jodatime DateTime 对象和语言环境的主要内容,如果未能解决你的问题,请参考以下文章

JodaTime 夏令时错误

Java - 使用DBUtils BeanListHandler将查询中的所有日期转换为JodaTime的DateTime

使用 ObjectMapper 为 JodaTime 设置时区偏移的 Jackson DateTime 格式

Groovy:Date[2]-Jodatime

在打包期间Gradle重复文件--JodaTime的messages.properties

打包过程中的 Gradle 重复文件 - JodaTime 的 messages.properties