Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将带有阿拉伯字符的字符串转换为日期_Java_Arabic_Java Time_Localdate_Date Parsing - Fatal编程技术网

Java 将带有阿拉伯字符的字符串转换为日期

Java 将带有阿拉伯字符的字符串转换为日期,java,arabic,java-time,localdate,date-parsing,Java,Arabic,Java Time,Localdate,Date Parsing,我试图通过Java和appium验证项目列表是否按照其日期描述进行排序。我设法将屏幕上的日期提取为字符串,但在将这些字符串转换为日期时遇到了困难,因为字符串基本上包含阿拉伯日期,如下所示: يناي٧٠٠٠٠ 我试着使用下面的代码 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu d MMMM ", new Locale("ar")); LocalDate orderDate = LocalDate.p

我试图通过Java和appium验证项目列表是否按照其日期描述进行排序。我设法将屏幕上的日期提取为字符串,但在将这些字符串转换为日期时遇到了困难,因为字符串基本上包含阿拉伯日期,如下所示: يناي٧٠٠٠٠

我试着使用下面的代码

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu d MMMM ", new Locale("ar"));
        LocalDate orderDate = LocalDate.parse(date, formatter);
但是,我收到以下错误:

java.time.format.DateTimeParseException: Text 'يناير ٧ ٢٠٢٠' could not be parsed at index 0

    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
    at java.base/java.time.LocalDate.parse(LocalDate.java:428)
    at com.hs.mobile.steps.MyOrdersSteps.getDate(MyOrdersSteps.java:142)
    at com.hs.mobile.steps.MyOrdersSteps.getOrdersDates(MyOrdersSteps.java:133)
    at com.hs.mobile.steps.MyOrdersSteps.verifyOrdersSortedByDateDesc(MyOrdersSteps.java:119)
    at com.hs.mobile.tests.MyOrdersTests.navigateToOrders_OrdersShouldBeSortedByDate(MyOrdersTests.java:30)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
    at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:584)
    at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:172)
    at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
    at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:804)
    at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
    at org.testng.TestRunner.privateRun(TestRunner.java:770)
    at org.testng.TestRunner.run(TestRunner.java:591)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:402)
    at org.testng.SuiteRunner.access$000(SuiteRunner.java:41)
    at org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:443)
    at org.testng.internal.thread.ThreadUtil.lambda$execute$0(ThreadUtil.java:67)
    at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
你能为这个问题提供一个合适的解决方案吗


谢谢

请查看我的解决方案,从ar转换到其他语言环境确实非常棘手,因为当你阅读阿拉伯语时,你必须从右向左阅读文本,如下所示:

the -> "يناير ٧ ٢٠٢٠" will be: january 7 2020  
SimpleDateFormat sdf =
            new SimpleDateFormat("MMMM d yyyy", Locale.forLanguageTag("ar-SA-nu-arab"));
因此DateFormatter将如下所示:

the -> "يناير ٧ ٢٠٢٠" will be: january 7 2020  
SimpleDateFormat sdf =
            new SimpleDateFormat("MMMM d yyyy", Locale.forLanguageTag("ar-SA-nu-arab"));
然后将其解析为日期:

Date d = sdf.parse(date);
并打印:

        System.out.println(d);
它将打印以下内容:

Tue Jan 07 00:00:00 MSK 2020
只需使用java.time和DateTimeFormatter即可 此代码段的输出为:

解析日期:2020-01-07


在我最诚实的意见中,您在尝试使用
DateTimeFormatter
进行工作时做得很对。这个类是java.time(现代java日期和时间API)的一部分。与陈旧过时的
SimpleDataFormat
不同,它默认使用西方数字,因此我们需要明确告诉它使用阿拉伯数字。正如评论中所讨论的,这种设计允许我们使用来自一种文化的月份名称和来自另一种文化的数字的任意组合构造格式化程序,用于格式化和解析。

您熟悉逻辑顺序和视觉顺序吗?问题中出现的日期字符串的第一部分是月份名称,因此模式字符串的第一部分必须是MMMM。很有趣。。。此模式在模式(“MMMM d yyyy”)的
日期时间格式中不起作用,但它告诉我文本“ي٠٠٠٠”无法在索引6处解析,而原始模式显示文本“ي٠٠٠٠٠٠”无法在索引0处解析。这意味着通过指向左右差异,您(至少部分)是正确的。你用
java.time
解析过它吗?我认为问题在于字符٧(我认为是7,分别是模式中的
d
),这实际上起了作用,谢谢。但是,如果我只想使用这种语言,不管是哪个国家的话,那该怎么办呢。这还能用吗?还有一个只针对语言的标签吗?请不要教年轻人使用早已过时且臭名昭著的
SimpleDateFormat
类。至少不是第一个选择。而且不是毫无保留的。今天,我们在及其
DateTimeFormatter
中有了更好的功能。这甚至被用在了问题中,它可以很好地完成任务,这里绝对没有理由使用其他任何东西。@deHaar
DateTimeFormatter
需要明确地告诉他使用阿拉伯数字(比如٧),而过时的
SimpleDateFormat
则是从语言环境中提取的。我不知道为什么在设计上会有这种差异。当然,越强大越好。。。我无法从问题中解析
字符串
,你知道怎么做吗?只是出于兴趣,我认为公认的答案对于Java4和更低版本是可以的,但不应该是这里唯一有效的答案。