我正在嘗試比較這兩個日期:
17 Oct. 2019 (08:23)
19 déc. 2019 (21:15)
月份是法語,主要問題是月份。我是否需要為每種型別的月份添加一個 if 陳述句,以便我可以將其切換到適當的月份?例如:
if (MonthValue.equals("oct."){
DateValue.replace("oct.","10");
}
或者是否有更簡單的解決方案,因為如果第一個值大于第二個值,我需要檢查表。
編輯:我的新代碼:
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)"
uj5u.com熱心網友回復:
使用帶有模式的 DateTimeFormatterdd MMM yyyy (HH:mm)來決議這樣的日期字串
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");
}
uj5u.com熱心網友回復:
格式模式字串中的 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()and .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 是在 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
鏈接: Trail:Date Time(Java? 教程)解釋了如何使用 java.time。
uj5u.com熱心網友回復:
我的建議:
- 決議日期,例如使用DateTimeFormatter到例如LocalDateTime
- 比較決議的日期(大多數日期和時間物件實作https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Comparable.html)
uj5u.com熱心網友回復:
我從您的問題中得到的是,您想將月份的名稱轉換為各自的數字。如果是這種情況,那么您應該嘗試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...");
}
uj5u.com熱心網友回復:
嘗試編碼為 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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/374925.html
上一篇:我如何每次將我的資料庫分成7行
下一篇:如何轉換CST時區中的日期列值
