2016-12-29 73 views
-4

我們有一個要求在java驗證當地時間之前,它是傳遞給調度程序像石英。系統收到倫敦當地時間說01:30 AM,但這次在2017年3月26日無效(夏時制)。 如何編寫代碼輸出以下結果?當地時間驗證日光

輸入

12:30, 01:30, 02:30 

輸出

Mar 26 2017 12:30 -> Valid, GMT 
Mar 26 2017 01:30 -> Invalid, NA 
Mar 26 2017 02:30 -> Valid, BST 
+0

'01:30'僅在'03月26日2017'無效。今天不是2017年3月26日,所以只有時間輸入,它是有效的。 ---另外,什麼是「NA」和「BST」,爲什麼'02:30'對'BST'有效,但是'12:30'是否針對'GMT'進行了驗證? ---你的問題不清楚。 – Andreas

+0

@Andreas關鍵是2017年3月26日是英國從GMT轉換到BST的日期 - 即夏令時開始。在那個特定的日子裏,沒有01:30這樣的時間,因爲時鐘從01:00跳到02:00。 OP要求提供一種方法來檢測日光節約季節(因此應理解爲BST)或夏季時間外(因此應該理解爲GMT)或兩者都不包含給定日期/時間。我發現這個問題很清楚。 –

+0

@DavidWallace問題完全不清楚,因爲輸入只是「01:30」,而不是「2017年3月26日01:30」。沒有日期,這個問題是無法回答的。 OP沒有說明使用什麼日期,甚至不是「今天」。 ---另外,'BST'是[布干維爾標準時間](https://www.timeanddate.com/time/zones/bst-bougainville)。大家都知道。或者,也許每個人都不知道BST的含義。再一次,問題還不清楚。 – Andreas

回答

1

假設你開始了LocalDateTime那麼你可以測試,看看它是有效的調度由一個給定的時區報告有一個有效偏移看到當時。此信息可在ZoneRules課程中獲得。

下面是一些示例代碼:

@Test 
public void test() throws Exception { 

    TimeZone tz = TimeZone.getTimeZone("Europe/London"); 
    ZoneId londonZone = tz.toZoneId(); 

    String springAhead = "2017-03-26T01:30"; 

    assertFalse(isValidForScheduling(londonZone, LocalDateTime.parse(springAhead))); 

    String fallBack = "2017-10-29T01:30"; 

    assertFalse(isValidForScheduling(londonZone, LocalDateTime.parse(fallBack))); 
} 

private boolean isValidForScheduling(ZoneId zoneId, LocalDateTime ldt) { 
    ZoneRules rules = zoneId.getRules(); 

    List<ZoneOffset> validOffsets = rules.getValidOffsets(ldt); 
    return validOffsets.size() == 1; 
} 

如果validOffsets列表爲空,則它不是一個有效的時間。如果有超過1個條目,則該時間會在該區域出現多次(將時鐘恢復)。如果只有一個條目,那麼這是一個固定的時間。

你可能想要在一個空列表上失敗,並在包含多個條目的列表上發出警告。

+0

非常接近。但10月29日01:30是有效的時間,但在當天發生兩次。 –

+0

上面的玩具方法是「isValidForScheduling」而不是「isValidTime」。您可以更改列表大小的語義,名稱和測試。如果應用程序是用於安排的,那麼正如我在答覆結束時所說的那樣,如果作業將執行多次,您可能要警告用戶。 Quartz文檔涵蓋了這一點。 – massfords

0

下面的代碼錯誤只適用於2017年3月26日1 AM-2AM。我不喜歡它的寫法。它可以重構嗎?這不誤差在10月29日2017年
LocalDateTime localDateTime = LocalDateTime.of(2017, 3, 26, hours, minutes);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("Europe/London"));
if (zonedDateTime.getHour() != localDateTime.getHour()) {
System.out.println("MISMATCH!!!");
}