如何在Java中解析包含Μαϊ(greek May)的日期字符串

Ale*_*tyl 5 java date date-parsing

我无法解析包含日期的字符串,其中包括5月份希腊文的短版本(Μαϊ,简称为Μαιου - 关于ϊ-difference差异的注释).

例如:

25 ??? 1989
24 ??? 1967
Run Code Online (Sandbox Code Playgroud)

如果我使用以下格式,将无法解析:

"d MMM yyyy"
"dd MMM yyyy"
Run Code Online (Sandbox Code Playgroud)

通过以下代码:

String dateString = "24 ??? 1967"; // just an example of an input String
SimpleDateFormat format = new SimpleDateFormat(someFormat);
format.parse(dateString);
Run Code Online (Sandbox Code Playgroud)

编辑:我试图解析的值是存储在Android的sqlite3数据库中的字符串.特别是它的联系生日.虽然Android依赖,但我会分享任何见解的代码:

Cursor cur = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI,null,null,null,null);
while(cur.moveToNext()){
   String birthdayString = cur.getString(INDEX_OF_BIRTHDAY);
}
Run Code Online (Sandbox Code Playgroud)

Fra*_*ker 5

这适用于我的机器(Java 8):

String dateString = "24 ??? 1967"; // just an example of an input String
SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy", new Locale("el", "GR"));
format.parse(dateString);
Run Code Online (Sandbox Code Playgroud)

您可以打印出可用的短月,如下所示:

Locale locale = new Locale("el", "GR");
DateFormatSymbols dfs = DateFormatSymbols.getInstance(locale);
for (String m : dfs.getShortMonths()) {
    System.out.println(m);
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 3

其他答案都是正确的,例如弗朗茨·贝克尔的答案。但他们使用旧的 java.util.Date 和 java.text.SimpleDateFormat 类。

\n\n

java.time

\n\n

以下是类似的代码,但使用 Java 8 及更高版本中的新java.timejava.time.format包。

\n\n

解析字符串

\n\n

该问题提供了两个示例输入字符串。注意不同的变音符号。第一个有效,但第二个失败。我没有解释,因为我不知道 \xe2\x80\x99t 语言 \xe2\x80\xa6 “这对我来说都是希腊语”。;-)

\n\n
String input1 = "25 \xce\x9c\xce\xb1\xcf\x8a 1989";\nString input2 = "24 \xce\x9c\xce\xb1\xce\x90 1967"; // Different diacritical over the "i".\n
Run Code Online (Sandbox Code Playgroud)\n\n

Locale使用 Java 7 中的新静态方法获取实例。为现代希腊语Locale.forLanguageTag指定ISO 639语言代码(通过IETF BCP 47 ) 。

\n\n
Locale locale = Locale.forLanguageTag("el");\n
Run Code Online (Sandbox Code Playgroud)\n\n

指定我们期望的确切模式。

\n\n
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd MMM yyyy" ).withLocale( locale );\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用新的 Java 8 Lambda 语法中parse采用方法引用(教程)的推荐方法进行解析。LocalDate :: from

\n\n
LocalDate localDate1 = formatter.parse( input1, LocalDate :: from );\nLocalDate localDate2 = formatter.parse( input2, LocalDate :: from );  // Fails\xe2\x80\xa6 Exception in thread "main" java.time.format.DateTimeParseException: Text \'24 \xce\x9c\xce\xb1\xce\x90 1967\' could not be parsed at index 3.\n
Run Code Online (Sandbox Code Playgroud)\n\n

转储到控制台。

\n\n
System.out.println( "localDate1 = " + localDate1 );\n
Run Code Online (Sandbox Code Playgroud)\n\n

运行时。

\n\n
String input1 = "25 \xce\x9c\xce\xb1\xcf\x8a 1989";\nString input2 = "24 \xce\x9c\xce\xb1\xce\x90 1967"; // Different diacritical over the "i".\n
Run Code Online (Sandbox Code Playgroud)\n\n

生成字符串

\n\n

换句话说,要生成 LocalDate 的字符串表示形式,请让 java.time 完成确定本地化格式的工作。使用自动本地化可能比硬编码特定格式更容易、更灵活。

\n\n
DateTimeFormatter formatterOutput =  DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( locale );\nString output = formatterOutput.format( localDate1 );\n\nSystem.out.println( "output = " + output );  // output = 25 \xce\x9c\xce\xb1\xcf\x8a 1989\n
Run Code Online (Sandbox Code Playgroud)\n\n

月份全名

\n\n

具有不同变音符号的第二个输入字符串似乎是完整月份名称的不恰当缩写\xce\x9c\xce\xb1\xce\x90\xce\xbf\xcf\x85。将完整的月份名称与另一个格式化程序(四个M模式字符)一起使用可以成功解析。再说一次,我不懂现代希腊语,所以这个解释只是我和评论这个答案的人的猜测。

\n\n

此示例代码演示了成功解析input3.

\n\n
String input1 = "25 \xce\x9c\xce\xb1\xcf\x8a 1989";\nString input2 = "24 \xce\x9c\xce\xb1\xce\x90 1967";  // Different diacritical over the "i". Incorrect abbreviation of full month name?\nString input3 = "23 \xce\x9c\xce\xb1\xce\x90\xce\xbf\xcf\x85 1978";  // Full month name with different diacritical.\n\nLocale locale = Locale.forLanguageTag( "el" );\nDateTimeFormatter formatterShort = DateTimeFormatter.ofPattern( "dd MMM yyyy" ).withLocale( locale );\nDateTimeFormatter formatterFull = DateTimeFormatter.ofPattern( "dd MMMM yyyy" ).withLocale( locale );\n\nLocalDate localDate1 = formatterShort.parse( input1, LocalDate :: from );\n// LocalDate localDate2 = formatter.parse( input2, LocalDate :: from );  // Fails\xe2\x80\xa6 Exception in thread "main" java.time.format.DateTimeParseException: Text \'24 \xce\x9c\xce\xb1\xce\x90 1967\' could not be parsed at index 3.\nLocalDate localDate3 = formatterFull.parse( input3, LocalDate :: from );\n\nSystem.out.println( "localDate1 = " + localDate1 );\nSystem.out.println( "localDate3 = " + localDate3 );\n
Run Code Online (Sandbox Code Playgroud)\n