gpt4 book ai didi

java - Java 1.6 中不同的日期格式选项应格式化为通用格式

转载 作者:行者123 更新时间:2023-12-02 11:37:30 27 4
gpt4 key购买 nike

我正在使用 Java 1.6。现在,我们有 12 个月的不同日期值,如下所示

sam. 26 janv. 2019 mer. 28 févr. 2018jeu. 15 mars 2018mer. 11 avr. 2018mar. 15 mai 2018mer. 20 juin 2018mer. 20 jul 2018mer. 22 août 2018mer. 12 sept. 2018mer. 24 oct. 2018Ven. 23 nov. 2018Dim. 16 déc. 2018

需要处理不同格式的日期。我需要一些通用方法来实现 sam 的通用格式。 2017 年 9 月 20 日

最佳答案

    DateTimeFormatter frenchDateFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("EEE")
.parseCaseSensitive()
.appendPattern(" d MMM uuuu")
.toFormatter(Locale.FRENCH)
.withResolverFields(ChronoField.DAY_OF_MONTH,
ChronoField.MONTH_OF_YEAR, ChronoField.YEAR);
for (String dateString : dates) {
dateString = dateString.replace("jul", "juil.");
String formattedDate = LocalDate.parse(dateString, frenchDateFormatter)
.format(frenchDateFormatter);
System.out.println(formattedDate);
}

鉴于此打印问题中的 12 个字符串

sam. 26 janv. 2019
mer. 28 févr. 2018
jeu. 15 mars 2018
mer. 11 avr. 2018
mar. 15 mai 2018
mer. 20 juin 2018
ven. 20 juil. 2018
mer. 22 août 2018
mer. 12 sept. 2018
mer. 24 oct. 2018
ven. 23 nov. 2018
dim. 16 déc. 2018

大多数日期字符串已经采用相当标准的格式,可以使用 EEE d MMM uuuu 格式模式进行识别。和法语语言环境。异常(exception)情况是:

  • mer. 20 jul 2018 有两个问题:2018 年 7 月 20 日将是星期五(vendredi,ven.),而不是星期三(mercredi,mer.)。 juillet(七月)的缩写是 juil. ,不是jul (您可能需要再次检查该字符串是否确实是您所拥有的字符串)。
  • 法语中星期几以小写字母开头,最后两个字符串为大写字母( Ven.Dim. )。

解决这些问题:

  • 使用格式化程序的 withResolverFields()告诉它使用哪些字段来确定日期;特别是,不要包含星期几,以便格式化程序在解析时容忍错误的星期几。
  • 使用dateString.replace()修复七月的错误月份缩写(我认为这是一个黑客行为;下面有一个更好的解决方案)。
  • 使用 DateTimeFormatterBuilder及其 parseCaseInsensitive方法构建一个忽略星期几大小写的格式化程序,以便 Ven. 中的大写字母和Dim.被接受(或者在解析之前使用 String.toLowercase(Locale.FRENCH))。

编辑:解析的镀金解决方案 jul而不是juil.因为月份名称告诉格式化程序我们使用的所有月份名称:

    Map<Long, String> monthMap = new HashMap<>();
// first put all the French month abbreviations into the map
for (Month m : Month.values()) {
monthMap.put(Long.valueOf(m.getValue()), m.getDisplayName(TextStyle.SHORT, Locale.FRENCH));
}
// finally overwrite the value for July with the one we get in our input strings
monthMap.put(Long.valueOf(Month.JULY.getValue()), "jul");

DateTimeFormatter frenchDateFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("EEE")
.parseCaseSensitive()
.appendPattern(" d ")
.appendText(ChronoField.MONTH_OF_YEAR, monthMap)
.appendPattern(" uuuu")
.toFormatter(Locale.FRENCH)
.withResolverFields(ChronoField.DAY_OF_MONTH,
ChronoField.MONTH_OF_YEAR, ChronoField.YEAR);

DateTimeFormatterBuilder.appendText()有一个重载版本,它接受要打印和解析的文本映射。因此,我们构建这样一个映射并将其传递给格式化程序构建器。由于它是从值到文本的映射,因此每个值只能有一个文本,因此上面只接受 jul (不是 juil. )。但现在你的字符串 mer. 20 jul 2018可以直接被格式化程序解析,我们不再需要先修复它。另一方面,如果你想要更标准的juil.在输出中,您需要使用单独的格式化程序进行格式化: DateTimeFormatter.ofPattern("EEE d MMM uuuu", Locale.FRENCH) .

我正在使用并推荐现代 Java 日期和时间 API,称为 java.time或 JSR-310。

但我说我使用的是 Java 1.6

没问题,使用 java.time与 Java 6 配合得很好。

  • 在 Java 8 及更高版本以及较新的 Android 设备中,现代 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,即新类的向后移植(ThreeTen for JSR 310;请参阅下面的链接)并将其添加到您的项目中。
  • 在较旧的 Android 上,请使用 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类。带有子包。

链接

关于java - Java 1.6 中不同的日期格式选项应格式化为通用格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48825725/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com