java - 将包含阿拉伯字符的字符串转换为日期

标签 java arabic java-time localdate date-parsing

我正在尝试通过 Java 和 appium 验证项目列表是否根据其日期 desc 排序。我设法从屏幕上将日期作为字符串提取出来,但我在将这些字符串转换为日期时遇到了困难,因为该字符串基本上包含阿拉伯语日期,如下所示: يناير٧٢٠٢٠

我尝试使用下面的代码,

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)

能否就此问题提出适当的解决方案?

谢谢

最佳答案

只需使用 java.time 和 DateTimeFormatter

    char arabicZero = '\u0660';
    DateTimeFormatter dateFormatter = DateTimeFormatter
            .ofPattern("MMMM d uuuu", Locale.forLanguageTag("ar"));
    DecimalStyle arabicDecimalStyle
            = dateFormatter.getDecimalStyle().withZeroDigit(arabicZero);
    dateFormatter = dateFormatter.withDecimalStyle(arabicDecimalStyle);

    String dateString = "يناير ٧ ٢٠٢٠";

    LocalDate date = LocalDate.parse(dateString, dateFormatter);
    System.out.println("Parsed date: " + date);

这段代码的输出是:

Parsed date: 2020-01-07

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

关于java - 将包含阿拉伯字符的字符串转换为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59749394/

相关文章:

java - 解析作为查询参数传递给 REST API 的不同日期的标准方法是什么?

java - "No row with the given identifier exists"虽然它确实存在

java - 如何返回没有它的科学记数法的 double ?

java - UTF-8 到 CP864(阿拉伯语)转换

javascript - 无法使用javascript替换特殊的字符组合

.htaccess - .htaccess RewriteRule 中的阿拉伯语 ( م ) 字符问题

java - 使用 DateTimeFormatterBuilder 解析非 UTC 日期

java - DateTimeFormatter 用于解析所有 ISO 有效样式的区域偏移

java - 创建对象时是否可以将属性设置为可选?

java - 扩展这个邻接列表实现