我正在开发一个Android项目,我正在实施本地化.
我将获得区域设置和时区.使用这些信息,我写了下面的代码:
String []locale= User.getInstance().getLanguage().split("-");//Assume, locale[0]=hi, locale[1]=INCalendar choosenDate = Calendar.getInstance(new Locale(locale[0],locale[1]));SimpleDateFormat Dformat = new SimpleDateFormat("MMMM dd yyyy",new Locale(locale[0],locale[1]));Log.d("MY_APP","***********Newly converted date:"+Dformat.format(choosenDate.getTime()));
我从上面的代码得到的日志是:
**********Newly converted date:सितंबर 07 2016
所以,基本上我面临的问题只是“MMMM”,即:月份部分被转换为指定的语言环境(在上面的语言中它是印地语(hi-IN)).然而,“dd yyyy”并没有被转换成印地语.
有人能告诉我我做错了什么,或者我怎样才能确保即使dd和yyyy部分也转换为指定的语言环境.
解决方法:
阿拉伯语与印度教风格的数字
显然你期望数字从阿拉伯风格转换为印度风格,如Wikipedia article on Arabic-Hindu numerals所示.(不是我对这个主题有任何了解.请原谅我在这里对语言/国家/传统术语的任何不当使用.)
你的问题并没有明显表明你是在追求数字数字的替代方式;发布到Stack Overflow时请更加小心.
Oracle Java 8上的阿拉伯风格
仅供参考,我使用现代java.time类运行以下代码,而不是问题中使用的麻烦的遗留日期时间类.我只得到阿拉伯风格的数字.
我循环遍历任意Locale
个对象的集合.对于每个I循环遍历所有四个FormatStyle
对象,指定用于自动本地化当前时刻输出的缩写长度.
ZoneID z = ZoneID.of ( "America/Montreal" );zoneddatetime zdt = zoneddatetime.Now ( z );List<Locale> locales = new ArrayList<> ();locales.add ( Locale.US );locales.add ( Locale.CANADA_french );locales.add ( Locale.TAIWAN );locales.add ( new Locale ( "hi" , "IN" ) ); // hindi, India.// locales.add ( new Locale ( "ar" , "MA" ) ); // arabic, MoroccoEnumSet<FormatStyle> formatStyles = EnumSet.allOf ( FormatStyle.class );for ( Locale locale : locales ) { System.out.println ( "—————" ); System.out.println ( "Locale: " + locale ); for ( FormatStyle formatStyle : formatStyles ) { DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime ( formatStyle ).withLocale ( locale ); System.out.println ( String.format ( "%1$-" + 20 + "s" , "FormatStyle: " + formatStyle ) + " → " + zdt.format ( f ) ); }}System.out.println ( "—————" );
在macOS上运行Java SE 8 Update 102的Oracle实现时.
—————Locale: en_USFormatStyle: FulL → Wednesday, September 7, 2016 6:46:00 PM EDTFormatStyle: LONG → September 7, 2016 6:46:00 PM EDTFormatStyle: MEDIUM → Sep 7, 2016 6:46:00 PMFormatStyle: SHORT → 9/7/16 6:46 PM—————Locale: fr_CAFormatStyle: FulL → mercredi 7 septembre 2016 18 h 46 EDTFormatStyle: LONG → 7 septembre 2016 18:46:00 EDTFormatStyle: MEDIUM → 2016-09-07 18:46:00FormatStyle: SHORT → 16-09-07 18:46—————Locale: zh_TWFormatStyle: FulL → 2016年9月7日 星期三 下午06時46分00秒 EDTFormatStyle: LONG → 2016年9月7日 下午06時46分00秒FormatStyle: MEDIUM → 2016/9/7 下午 06:46:00FormatStyle: SHORT → 2016/9/7 下午 6:46—————Locale: hi_INFormatStyle: FulL → बुधवार, 7 सितंबर, 2016 6:46:00 अपराह्न EDTFormatStyle: LONG → 7 सितंबर, 2016 6:46:00 अपराह्न EDTFormatStyle: MEDIUM → 7 सितंबर, 2016 6:46:00 अपराह्नFormatStyle: SHORT → 7/9/16 6:46 अपराह्न—————
谜团:遗留类的执行方式与java.time类不同
奇怪的是,当我使用问题中的确切源代码时,我也得到了与the Answer by Dac Saunders中Hindu/Indian-style numerals相同的输出.
所以我简化了代码.实际上,在格式化java.util.Date对象时,该源代码实际上是在实例化java.util.Calendar对象.所以我完全删除了日历.
Locale l = new Locale ( "hi" , "IN" );// java.timeDateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMMM dd uuuu" ).withLocale ( l );System.out.println ( zoneddatetime.Now ().format ( f ) );// Legacy date-time classes.SimpleDateFormat dFormat = new SimpleDateFormat ( "MMMM dd yyyy" , l );System.out.println ( dFormat.format ( new java.util.Date () ) );
सितंबर 07 2016
सितंबर ०७ २०१६
虽然我不完全理解这种行为,但似乎我们可以根据Zax的AndroID行为,Dac Saunders的Ubuntu linux体验以及我在macOS上的经验得出两个结论:
>传统日期时间类的AndroID实现不同于linux&苹果系统.在AndroID,阿拉伯风格的数字,而在linux / macOS上我们得到印度风格.
> java.time类只提供阿拉伯风格的数字,其行为与他们取代印度风格的遗留类别不同.也许应该提交错误报告.
关于java.time
java.time框架内置于Java 8及更高版本中.这些类取代了麻烦的旧日期时间类,例如java.util.Date,.Calendar,& java.text.SimpleDateFormat中.
Joda-Time项目,现在是maintenance mode,建议迁移到java.time.
要了解更多信息,请参阅Oracle Tutorial.并搜索Stack Overflow以获取许多示例和说明.
许多java.time功能都被反向移植到Java 6& 7在ThreeTen-Backport中进一步适应Android的Android(见How to use…).
ThreeTen-Extra项目使用其他类扩展了java.time.该项目是未来可能添加到java.time的试验场.您可以在这里找到一些有用的课程,如Interval,YearWeek,YearQuarter等.
总结以上是内存溢出为你收集整理的java – 将日期转换为其他语言环境全部内容,希望文章能够帮你解决java – 将日期转换为其他语言环境所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)