我收到一個查詢引數日期,如yyyy-MM-DD (2022-03-08).
我想將其轉換為java.util.Calendar/java.util.GregorianCalendar格式。
所以我的想法是轉換:字串 -> ZonedDateTime -> 日歷。
我做了什么:
ZonedDateTime parsedDate = ZonedDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//date = 2022-03-08
即使格式正確,我也得到:
Text '2022-03-08' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 2022-03-08 of type java.time.format.Parsed
我發現發生此錯誤是因為我的字串沒有 TimeZone。
一個建議是使用LocalDate
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date = LocalDate.parse(fecha, formatter);
但我不能localDate用作ZonedDateTime.parse().
我還能嘗試什么?
uj5u.com熱心網友回復:
我想將其轉換為 java.util.Calendar / java.util.GregorianCalendar 格式。
這似乎很愚蠢;Calendar/GregorianCalendar 已過時,API 也很糟糕。當工具箱里有一把閃亮的新螺絲刀時,為什么還要使用一把壞了的螺絲刀?不要這樣做。
所以我的想法是轉換:字串 -> ZonedDateTime -> 日歷。
這似乎很愚蠢。該字串不包含ZonedDateTime. 它甚至不包含LocalDateTime. 它顯然是一個LocalDate. 因此,將其轉換為本地日期,然后從那里開始。
該java.time包的強大之處在于每個不同的時間概念在正確命名的 jt 包中都有一個匹配的型別。例如,java.util.Date是一個謊言:它是一個時間戳,它與日期沒有任何關系;向 Date 物件詢問“現在是哪一年”已損壞(嘗試一下,您會收到警告)。
同樣,日歷是完全錯誤的。它根本不代表日歷;它也代表一個時間戳。
LocalDate另一方面是完美的事實:它表示日期(不是時間),并且不包括時區或其他本地化資訊:它僅在“本地”時才有意義。
每一站都應該是有意義的,就其本身而言:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd");
LocalDate date = LocalDate.parse("2022-10-01", formatter);
到目前為止,一切都很好。我就停在那里——為什么要撒謊?為什么回傳一個既是 API 明智的謊言(該類不代表日歷)的 Calendar,即使有人確切知道 Calendar 是什么,它仍然是謊言:日歷意味著它具有準確的時間和時區。你沒有時間,也沒有時區。為什么要回傳一些暗示不存在的東西的東西?
但是,如果你必須,然后明確添加一個時區和時間,然后去吧:
ZonedDateTime zdt = someLocalDate.atStartOfDay().atZone(ZoneId.of("Europe/Amsterdam"));
GregorianCalendar gc = GregorianCalendar.from(zdt);
此代碼清晰易讀:代碼選擇時間和區域非常清晰。
但是,再一次,現在你最終得到了一個可怕的、可怕的物件,你不應該使用任何東西。
uj5u.com熱心網友回復:
ZonedDateTime除了靜態方法之外,還有其他方法可以獲得 a parse()。以下是將 aLocalDateTime變成 a 的方法ZonedDateTime:
ZonedDateTime zoned = dateTime.atZone(ZoneId.of( "America/New_York"));
或者如果您有LocalDate:
ZonedDateTime zoned =
date.atStartOfDay( ZoneId.of( "America/New_York" ));
我不會使用java.util.Calendaror Date。他們是垃圾。根據您是否需要跟蹤時區,我要么堅持使用,LocalDate要么使用。ZonedDateTime我猜這應該可以讓你到達你想去的地方,因為聽起來你知道一旦你有了一個ZonedDateTime.
更新:我查找了如何將 ZoneDateTime 轉換為日歷:
Calendar calendar = GregorianCalendar.from(zoned);
以防萬一你沒有走那么遠,真的想走那條路。
uj5u.com熱心網友回復:
這是一些可行的代碼-您不需要指定格式化程式,但我想如果您真的想的話可以使用格式化程式:)
import java.time.LocalDate;
LocalDate parsed = LocalDate.parse("2022-03-08");
System.out.println(parsed);
import java.util.Calendar;
Calendar c = Calendar.getInstance();
// Need to subtract 1 from month value since it is 1-based and Calendar month is 0-based
c.set(parsed.getYear(), parsed.getMonthValue() - 1, parsed.getDayOfMonth());
System.out.println(c);
但是為什么要使用 java.util.Calendar API?這被認為是遺產。java.time.* API 是首選。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/440096.html
上一篇:將回傳值分配給變數會中斷遞回
下一篇:JPA物體在服務層中為空
