安卓应用中的阿拉伯日期

5

我正在开发Android应用,并计划在下一个版本中添加阿拉伯语言支持,但是我遇到了一个问题。

问题是:Android操作系统会动态地将日期转换成阿拉伯格式,而我在URL参数中使用了这个日期,但是服务器无法读取它。

如何将任何阿拉伯日期转换为英文日期?!?

Android操作系统显示的内容是:١٤-٠٥-٢٠١٤
我需要的内容是:2014-05-14

我尝试了一些Java代码,例如:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd",Locale.ENGLISH);

Android系统不支持阿拉伯语的Locale.Arabic格式。

当您将手机转换为阿拉伯语时,此问题就会出现。


“SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd",Locale.ENGLISH);” 没有起作用吗? - njzk2
无效,不起作用,我非常惊讶,它一定要工作 :( - Muhamet Aljobairi
@njzk2 我找到解决方案了 :D 我必须这样做 SimpleDateFormat displayFormat = new SimpleDateFormat("dd-MM-yyyy"); SimpleDateFormat parseFormat = new SimpleDateFormat("yyyy-MM-dd"); - Muhamet Aljobairi
@MhmdAljobairi,您能否详细说明您的答案。 - SoH
@SoH,问题在于我将日期格式从左到右排列,而阿拉伯语需要将其从右到左排列。 SimpleDateFormat displayFormat = new SimpleDateFormat("dd-MM-yyyy");SimpleDateFormat parseFormat = new SimpleDateFormat("yyyy-MM-dd"); - Muhamet Aljobairi
3个回答

6

简而言之

您所期望的格式恰好在ISO 8601标准中定义。在解析/生成文本时,java.time类默认使用标准格式。

LocalDate.now().toString()

2019年1月23日

本地化为美国英语

LocalDate
.now(
    ZoneId.of( "America/Chicago" ) 
)
.format(
    DateTimeFormatter.ofLocalizedDate(
        FormatStyle.FULL   // or LONG or MEDIUM or SHORT
    )
    .withLocale(  
        new Locale( "en" , "US" )   // English language, with cultural norms of United States. 
    )
)

对于突尼斯的阿拉伯语, 使用:

new Locale( "ar" , "TN" )

避免使用旧版日期时间类

您正在使用最早版本的Java捆绑的可怕日期时间类。随着JSR 310的采用,它们已被完全取代为java.time类。对于早期的Android,请参见下面的小圆点。

Locale

而Android没有Locale.Arabic格式

只有很少数的区域设置具有命名常量。学习通过标准语言代码和国家(文化)代码指定Locale,如Locale类所述。有关更多信息,请参见此相关问题

例如,对于沙特阿拉伯文化规范的阿拉伯语言, 请使用:

Locale locale = new Locale( "ar" , "SA" ) ;  // Arabic language. Saudi Arabia cultural norms.

我们可以使用该地区设置来本地化表示某一时刻的文本。
ZoneId z = ZoneId.of( "Pacific/Auckland" );  // By the way, time zone has *nothing* to do with locale, orthogonal issues.
ZonedDateTime zdt = ZonedDateTime.now( z );
Locale locale = new Locale( "ar" , "SA" );
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale );
String output = zdt.format( f );

当运行时。

Friday, January 18, 2019 12:14:00 PM New Zealand Daylight Time

要查看系统中可用的所有区域定义,请运行此代码。
    for ( Locale locale : Locale.getAvailableLocales() ) {
        System.out.println( locale.toString() + "  Name: " + locale.getDisplayName( Locale.US ) );
    }

今天的英文日期

LocalDate类表示仅包含日期值而不包含时间和时区与UTC偏移量的值。

时区对于确定日期至关重要。对于任何给定时刻,日期在全球各地的区域内变化。例如,在法国巴黎的午夜后几分钟是新的一天,而在加拿大魁北克省蒙特利尔仍然是“昨天”。

如果没有指定时区,则JVM会隐式地应用其当前默认时区。该默认值可能在运行时任意更改,因此您的结果可能会有所不同。最好将所需/期望的时区明确指定为参数。

请以 大陆/地区 的格式指定一个适当的时区名称,例如 America/MontrealAfrica/CasablancaPacific/Auckland。永远不要使用2-4个字母的缩写,如ESTIST,因为它们不是真正的时区,没有标准化,甚至不唯一(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

如果您想使用JVM的当前默认时区,请请求并作为参数传递。如果省略,则代码变得模糊,我们无法确定您是否打算使用默认值,或者像许多程序员一样,不知道这个问题。
ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

或者指定一个日期。您可以通过数字设置月份,1-12代表一月到十二月。

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

或者更好的办法是使用预定义的Month枚举对象,每年一个。提示:在整个代码库中使用这些Month对象而不是仅仅使用整数来使您的代码更加自我记录,确保有效值并提供类型安全性。对于YearYearMonth也是如此。
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

要生成本地化为英语的文本,请使用DateTimeFormatter.ofLocalizedDate
FormatStyle formatStyle = FormatStyle.FULL ;
Locale locale = new Locale( "en" , "US" ) ; // English language, United States cultural norms.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( formatStyle ).withLocale( locale );
String output = localDate.format( f ) ;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的传统日期时间类,例如java.util.Date, CalendarSimpleDateFormat

Joda-Time 项目现处于维护模式,建议迁移到java.time 类。

想要了解更多,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

您可以直接使用java.time 对象与数据库进行交换。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。无需使用字符串,也不需要使用java.sql.* 类。

如何获取 java.time 类?

ThreeTen-Extra 项目扩展了 java.time 的附加类。该项目是 java.time 可能的未来添加的试验场。您可能会在此处找到一些有用的类,例如 Interval, YearWeek, YearQuarter更多


2

这是有效的。

val formatterNew = SimpleDateFormat(requiredFormat,Locale.forLanguageTag("ar"))


OP要求使用JAVA语言编写程序,你的代码是用Kotlin编写的。我投票决定关闭此问题。 - Abhishek Dutt

1

只需使用以下代码以在本地化中获取英语日期。

   Date currentDate = new Date();
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
   System.out.println(sdf.format(currentDate));

1
请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的老旧日期时间类现在已经过时,被java.time类所取代。大部分java.time功能已经在ThreeTen-Backport项目中向Java 6和Java 7进行了回溯。而在ThreeTenABP中还进一步适配了早期的Android(<26)。请参阅如何使用ThreeTenABP… - Basil Bourque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接