Android 应用程序上的阿拉伯语日期

Muh*_*iri 5 java android date

我正在开发 android 应用程序,以及在应用程序上添加阿拉伯语的下一个版本,但我有一个问题。

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

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

Android 操作系统向我展示了什么:??-??-??
我需要的是:2014-05-14

我累了一些这样的Java行:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd",Locale.ENGLISH);
Run Code Online (Sandbox Code Playgroud)

并且 Android 没有 Locale.Arabic 格式

将手机转换为阿拉伯语时出现问题

Bas*_*que 5

tl;博士

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

LocalDate.now().toString()
Run Code Online (Sandbox Code Playgroud)

2019-01-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. 
    )
)
Run Code Online (Sandbox Code Playgroud)

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

new Locale( "ar" , "TN" )
Run Code Online (Sandbox Code Playgroud)

避免遗留的日期时间类

您正在使用与最早版本的 Java 捆绑在一起的糟糕的日期时间类。随着 JSR 310 的采用,它们被java.time类完全取代。对于早期的 Android,请参见下方底部的项目符号。

Locale

并且 Android 没有 Locale.Arabic 格式

许多语言环境中只有少数具有命名常量。学习Locale通过标准语言代码和国家(文化)代码指定一个,如Locale课堂中所解释的。有关更多信息,请参阅此相关问题

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

Locale locale = new Locale( "ar" , "SA" ) ;  // Arabic language. Saudi Arabia cultural norms.
Run Code Online (Sandbox Code Playgroud)

我们可以使用该语言环境来本地化代表某个时刻的文本。

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 );
Run Code Online (Sandbox Code Playgroud)

跑的时候。

??????? 18个??????2019 12:14:00?????? ????????? ??????

要查看系统上可用的所有语言环境定义,请运行此代码。

    for ( Locale locale : Locale.getAvailableLocales() ) {
        System.out.println( locale.toString() + "  Name: " + locale.getDisplayName( Locale.US ) );
    }
Run Code Online (Sandbox Code Playgroud)

今天的英文日期

LocalDate级表示没有时间的天,没有一个日期,只值时区偏移从-UTC

时区对于确定日期至关重要。对于任何给定时刻,日期因地区而异。例如,在法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天” 。

如果未指定时区,JVM 会隐式应用其当前默认时区。该默认值可能会在运行时随时更改(!),因此您的结果可能会有所不同。最好将您想要/预期的时区明确指定为参数。

以、、 或等格式指定正确的时区名称。永远不要使用 2-4 个字母的缩写,例如或因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。Continent/RegionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;
Run Code Online (Sandbox Code Playgroud)

如果您想使用 JVM 的当前默认时区,请询问它并作为参数传递。如果省略,代码读起来会变得模棱两可,因为我们不确定您是否打算使用默认值,或者您是否像许多程序员一样没有意识到这个问题。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
Run Code Online (Sandbox Code Playgroud)

或指定日期。您可以通过数字设置月份,对于 1 月至 12 月,合理编号为 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.
Run Code Online (Sandbox Code Playgroud)

或者,更好的是使用Month预定义的枚举对象,一年中的每个月一个。提示:Month在整个代码库中使用这些对象而不仅仅是整数,以使您的代码更具自文档性、确保有效值并提供类型安全。同上Year& YearMonth

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
Run Code Online (Sandbox Code Playgroud)

要生成本地化为英语的文本,请使用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 ) ;
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

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

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

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

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


Gun*_*gar 1

只需使用下面的代码即可在本地化中获取英语语言的日期。

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