要解析的時候,你可以做在@Jon Skeet's answer解釋說:
String input = "5:45 PM";
DateTimeFormatter parser = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
LocalTime time = LocalTime.parse(input, parser);
請注意,我還使用了java.util.Locale
,因爲如果不指定它,它將使用系統的默認區域設置 - 某些區域設置可以爲AM/PM字段使用不同的符號。使用顯式區域設置避免了這種情況(即使在運行時也可以更改默認區域設置,所以最好使用明確區域設置)。
要與今天的日期相結合,你需要一個java.time.LocalDate
(獲取日期),並與LocalTime
結合起來,得到一個LocalDateTime
:
// combine with today's date
LocalDateTime combined = LocalDate.now().atTime(time);
然後你可以使用其他格式格式化LocalDateTime
:
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
System.out.println(combined.format(fmt));
的輸出是:
16/08/2017 17:45
如果你想在LocalDateTime
轉換爲java.util.Date
,你必須採取的一些細節問題。
A java.util.Date
表示自1970-01-01T00:00Z
(又名Unix Epoch)以來的毫秒數。這是一個瞬間(特定時間點)。檢查this article瞭解更多信息。
所以,同樣Date
對象可以表示不同的日期或時間,這取決於你在哪裏:覺得,現在,在這一刻,每個人都在世界上處於同一時刻(因爲1970-01-01T00:00Z
相同的毫秒數),但當地的日期和時間在世界各地都不一樣。
A LocalDateTime
表示「本地」這個概念:它是日期(日,月和年)和時間(小時,分鐘,秒和納秒),但與特定時區沒有任何關係。
對象可以代表不同時間點的不同時刻。所以,要將其轉換爲Date
,您必須定義您想要的時區。
一種選擇是使用系統的默認時區:
// convert to system's default timezone
ZonedDateTime atDefaultTimezone = combined.atZone(ZoneId.systemDefault());
// convert to java.util.Date
Date date = Date.from(atDefaultTimezone.toInstant());
但是默認可以從系統/環境而有所不同,也可以改變,甚至在運行時。爲了不依賴於,並已超過它更多的控制,你可以使用一個明確的區域:
// convert to a specific timezone
ZonedDateTime zdt = combined.atZone(ZoneId.of("Europe/London"));
// convert to java.util.Date
Date date = Date.from(zdt.toInstant());
請注意,我用Europe/London
。該API使用IANA timezones names(始終格式爲Region/City
,如America/Sao_Paulo
或Europe/Berlin
)。 避免使用3字母縮寫(如CST
或),因爲它們是ambiguous and not standard。
通過調用ZoneId.getAvailableZoneIds()
,您可以獲得可用時區列表(並選擇最適合您系統的時區)。
還有夏時制的角落案例(當LocalDateTime
可能存在兩次或由於overlaps and gaps而不能存在時)。在這種情況下,Jon's solution使用ZonedDateTime
可避免此問題)。
使用SimpleDateForma classt處理java中的每種格式。 –
@AMALlal:理想情況下,不要使用'java.time'。 –
@Jon:我的壞 –