将日期与月份作为字符串进行比较
Comparing dates with months as strings
我正在尝试比较这两个日期:
17 Oct. 2019 (08:23)
19 déc. 2019 (21:15)
月份是法语,主要问题是月份。我是否需要为每种类型的月份添加一个 if 语句,以便我可以将其切换为适当的月份?例如:
if (MonthValue.equals("oct."){
DateValue.replace("oct.","10");
}
或者是否有更简单的解决方案,因为如果第一个值大于第二个值,我需要检查 table。
编辑:
我的新密码:
String target1 = "17 oct. 2019 (08:23)";
String target2 = "19 déc. 2019 (21:15)";
DateFormat df = new SimpleDateFormat("dd MMM. YYYY (kk:mm)", Locale.FRENCH);
Date result = df.parse(target1);
Date result2 = df.parse(target2);
System.out.println(result);
System.out.println(result2);
if(result.compareTo(result2) < 0) {
System.out.println("true");
}
else {
System.out.println("false");
}
不工作给出这个错误:
java.text.ParseException: Unparseable date: "17 oct. 2019 (08:23)"
我的推荐:
- 解析日期,例如DateTimeFormatter to e.g. a LocalDateTime
- 比较解析的日期(大多数日期和时间对象实现 https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Comparable.html)
我从你的问题中得到的是,你想将月份的名称转换为它们各自的数字。如果是这种情况,那么您应该尝试 switch
示例:
switch (MonthValue){
case jan:
MonthValue = 1; // Set Month variable to it Numbered Position (type casting might be required)
break;
case feb:
MonthValue = 2;
break;
default:
System.out.println("Somthing...");
}
使用带有模式 dd MMM yyyy (HH:mm)
的 DateTimeFormatter 来像这样解析日期字符串
String target1 = "17 oct. 2019 (08:23)";
String target2 = "19 déc. 2019 (21:15)";
Locale locale = Locale.FRANCE;
DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder().appendPattern("dd MMM yyyy (HH:mm)")
.toFormatter(locale);
LocalDateTime dateTime1 = LocalDateTime.parse(target1, dateTimeFormatter);
LocalDateTime dateTime2 = LocalDateTime.parse(target2, dateTimeFormatter);
System.out.println(dateTime1);
System.out.println(dateTime2);
if (dateTime1.compareTo(dateTime2) < 0) {
System.out.println("true");
} else {
System.out.println("false");
}
尝试编码为 UTF8,这将避免 DateTimeParseException
Exception in thread "main" java.time.format.DateTimeParseException: Text '19 d??c. 2019 (21:15)' could not be parsed at index 3
public static void main(String args[]) throws Exception {
String date1 = "17 oct. 2019 (08:23)";
String date2 = "19 déc. 2019 (21:15)";
DateTimeFormatter longDateTimeFormatter = DateTimeFormatter.ofPattern("dd MMM yyyy (HH:mm)").withLocale(Locale.FRENCH);
LocalDateTime lclDate1 = LocalDateTime.parse(encodeUTF8(date1), longDateTimeFormatter);
LocalDateTime lclDate2 = LocalDateTime.parse(encodeUTF8(date2), longDateTimeFormatter);
if (lclDate1.compareTo(lclDate2) < 0) {
System.out.println("true");
}
else {
System.out.println("false");
}
}
public static String encodeUTF8(String dateStr) {
byte[] bytes = dateStr.getBytes();
String utf8EncodStr = new String(bytes, StandardCharsets.UTF_8);
return utf8EncodStr;
}
java.time 和格式模式字符串中的可选部分
与其他人一样,我建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。据我了解,如果您的月份名称不超过五个字母(例如 avril),它们将完整写出,而如果它们不超过七个字母(例如 juillet),它们是缩写形式。以下格式化程序可以在两种情况下解析:
private static final DateTimeFormatter DATE_FORMATTER
= new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("dd [MMMM][MMM] uuuu (HH:mm)")
.toFormatter(Locale.FRENCH);
格式模式字符串中的方括号[]
包围可选部分。 MMMM
是完整的月份名称。 MMM
为缩写。所以 [MMMM][MMM]
中的要点是它将成功解析完整的月份名称或缩写,并跳过不起作用的那个。由于您举了一个 Oct.
是用大写字母 O
编写的示例,因此我还指定了解析不应区分大小写。如果这不是必需的,您可以使用这个更简单的格式化程序:
private static final DateTimeFormatter DATE_FORMATTER
= DateTimeFormatter.ofPattern("dd [MMMM][MMM] uuuu (HH:mm)", Locale.FRENCH);
为了检查所有月份是否工作,我设置了这些测试数据:
String[] dateStrings = {
"17 Oct. 2019 (08:23)",
"19 déc. 2019 (21:15)",
"01 avril 2021 (09:40)",
"08 janv. 2020 (01:18)",
"28 févr. 2021 (21:41)",
"03 mars 2020 (22:54)",
"06 mai 2020 (03:14)",
"21 juin 2020 (07:15)",
"18 juil. 2020 (23:06)",
"06 août 2020 (22:28)",
"29 sept. 2020 (06:04)",
"18 nov. 2019 (01:35)"
};
要解析和比较其中两个,请使用 LocalDateTime.parse()
和 .isBefore()
:
LocalDateTime dateTime1 = LocalDateTime.parse(dateStrings[1], DATE_FORMATTER);
LocalDateTime dateTime2 = LocalDateTime.parse(dateStrings[2], DATE_FORMATTER);
if (dateTime1.isBefore(dateTime2)) {
System.out.format(Locale.FRENCH, "%s is before %s%n", dateTime1, dateTime2);
}
输出:
2019-12-19T21:15 is before 2021-04-01T09:40
为了比较,您还可以利用 LocalDateTime
实现 Comparable
这一事实。例如,这在对日期和时间进行排序时很实用。作为一个简短的例子,让我们对解析上述字符串后得到的所有 LocalDateTime
个对象进行排序:
Arrays.stream(dateStrings)
.map(ds -> LocalDateTime.parse(ds, DATE_FORMATTER))
.sorted()
.forEach(System.out::println);
2019-10-17T08:23
2019-11-18T01:35
2019-12-19T21:15
2020-01-08T01:18
2020-03-03T22:54
2020-05-06T03:14
2020-06-21T07:15
2020-07-18T23:06
2020-08-06T22:28
2020-09-29T06:04
2021-02-28T21:41
2021-04-01T09:40
Link: Trail: Date Time (The Java™ Tutorials) 解释如何使用 java.time.
我正在尝试比较这两个日期:
17 Oct. 2019 (08:23)
19 déc. 2019 (21:15)
月份是法语,主要问题是月份。我是否需要为每种类型的月份添加一个 if 语句,以便我可以将其切换为适当的月份?例如:
if (MonthValue.equals("oct."){
DateValue.replace("oct.","10");
}
或者是否有更简单的解决方案,因为如果第一个值大于第二个值,我需要检查 table。
编辑: 我的新密码:
String target1 = "17 oct. 2019 (08:23)";
String target2 = "19 déc. 2019 (21:15)";
DateFormat df = new SimpleDateFormat("dd MMM. YYYY (kk:mm)", Locale.FRENCH);
Date result = df.parse(target1);
Date result2 = df.parse(target2);
System.out.println(result);
System.out.println(result2);
if(result.compareTo(result2) < 0) {
System.out.println("true");
}
else {
System.out.println("false");
}
不工作给出这个错误:
java.text.ParseException: Unparseable date: "17 oct. 2019 (08:23)"
我的推荐:
- 解析日期,例如DateTimeFormatter to e.g. a LocalDateTime
- 比较解析的日期(大多数日期和时间对象实现 https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Comparable.html)
我从你的问题中得到的是,你想将月份的名称转换为它们各自的数字。如果是这种情况,那么您应该尝试 switch
示例:
switch (MonthValue){
case jan:
MonthValue = 1; // Set Month variable to it Numbered Position (type casting might be required)
break;
case feb:
MonthValue = 2;
break;
default:
System.out.println("Somthing...");
}
使用带有模式 dd MMM yyyy (HH:mm)
的 DateTimeFormatter 来像这样解析日期字符串
String target1 = "17 oct. 2019 (08:23)";
String target2 = "19 déc. 2019 (21:15)";
Locale locale = Locale.FRANCE;
DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder().appendPattern("dd MMM yyyy (HH:mm)")
.toFormatter(locale);
LocalDateTime dateTime1 = LocalDateTime.parse(target1, dateTimeFormatter);
LocalDateTime dateTime2 = LocalDateTime.parse(target2, dateTimeFormatter);
System.out.println(dateTime1);
System.out.println(dateTime2);
if (dateTime1.compareTo(dateTime2) < 0) {
System.out.println("true");
} else {
System.out.println("false");
}
尝试编码为 UTF8,这将避免 DateTimeParseException
Exception in thread "main" java.time.format.DateTimeParseException: Text '19 d??c. 2019 (21:15)' could not be parsed at index 3
public static void main(String args[]) throws Exception {
String date1 = "17 oct. 2019 (08:23)";
String date2 = "19 déc. 2019 (21:15)";
DateTimeFormatter longDateTimeFormatter = DateTimeFormatter.ofPattern("dd MMM yyyy (HH:mm)").withLocale(Locale.FRENCH);
LocalDateTime lclDate1 = LocalDateTime.parse(encodeUTF8(date1), longDateTimeFormatter);
LocalDateTime lclDate2 = LocalDateTime.parse(encodeUTF8(date2), longDateTimeFormatter);
if (lclDate1.compareTo(lclDate2) < 0) {
System.out.println("true");
}
else {
System.out.println("false");
}
}
public static String encodeUTF8(String dateStr) {
byte[] bytes = dateStr.getBytes();
String utf8EncodStr = new String(bytes, StandardCharsets.UTF_8);
return utf8EncodStr;
}
java.time 和格式模式字符串中的可选部分
与其他人一样,我建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。据我了解,如果您的月份名称不超过五个字母(例如 avril),它们将完整写出,而如果它们不超过七个字母(例如 juillet),它们是缩写形式。以下格式化程序可以在两种情况下解析:
private static final DateTimeFormatter DATE_FORMATTER
= new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("dd [MMMM][MMM] uuuu (HH:mm)")
.toFormatter(Locale.FRENCH);
格式模式字符串中的方括号[]
包围可选部分。 MMMM
是完整的月份名称。 MMM
为缩写。所以 [MMMM][MMM]
中的要点是它将成功解析完整的月份名称或缩写,并跳过不起作用的那个。由于您举了一个 Oct.
是用大写字母 O
编写的示例,因此我还指定了解析不应区分大小写。如果这不是必需的,您可以使用这个更简单的格式化程序:
private static final DateTimeFormatter DATE_FORMATTER
= DateTimeFormatter.ofPattern("dd [MMMM][MMM] uuuu (HH:mm)", Locale.FRENCH);
为了检查所有月份是否工作,我设置了这些测试数据:
String[] dateStrings = {
"17 Oct. 2019 (08:23)",
"19 déc. 2019 (21:15)",
"01 avril 2021 (09:40)",
"08 janv. 2020 (01:18)",
"28 févr. 2021 (21:41)",
"03 mars 2020 (22:54)",
"06 mai 2020 (03:14)",
"21 juin 2020 (07:15)",
"18 juil. 2020 (23:06)",
"06 août 2020 (22:28)",
"29 sept. 2020 (06:04)",
"18 nov. 2019 (01:35)"
};
要解析和比较其中两个,请使用 LocalDateTime.parse()
和 .isBefore()
:
LocalDateTime dateTime1 = LocalDateTime.parse(dateStrings[1], DATE_FORMATTER);
LocalDateTime dateTime2 = LocalDateTime.parse(dateStrings[2], DATE_FORMATTER);
if (dateTime1.isBefore(dateTime2)) {
System.out.format(Locale.FRENCH, "%s is before %s%n", dateTime1, dateTime2);
}
输出:
2019-12-19T21:15 is before 2021-04-01T09:40
为了比较,您还可以利用 LocalDateTime
实现 Comparable
这一事实。例如,这在对日期和时间进行排序时很实用。作为一个简短的例子,让我们对解析上述字符串后得到的所有 LocalDateTime
个对象进行排序:
Arrays.stream(dateStrings)
.map(ds -> LocalDateTime.parse(ds, DATE_FORMATTER))
.sorted()
.forEach(System.out::println);
2019-10-17T08:23 2019-11-18T01:35 2019-12-19T21:15 2020-01-08T01:18 2020-03-03T22:54 2020-05-06T03:14 2020-06-21T07:15 2020-07-18T23:06 2020-08-06T22:28 2020-09-29T06:04 2021-02-28T21:41 2021-04-01T09:40
Link: Trail: Date Time (The Java™ Tutorials) 解释如何使用 java.time.