java– 将日期转换为其他语言环境

java– 将日期转换为其他语言环境,第1张

概述我正在开发一个Android项目,我正在实施本地化.我将获得区域设置和时区.使用这些信息,我写了下面的代码:String[]locale=User.getInstance().getLanguage().split("-");//Assume,locale[0]=hi,locale[1]=INCalendarchoosenDate=Calendar.getInstance(newLocale(locale[0]

我正在开发一个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 – 将日期转换为其他语言环境所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1111169.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存