鳞翅目动物的诅咒:玩java.time
流行測驗:這個小程序的輸出是什么?
就像最有趣的問題一樣,答案是“取決于”。 它如何依賴? 好吧,讓我們嘗試一些例子:
- getHoursOfDay(LocalDate.of(2014, 7, 15), ZoneId.of("Asia/Colombo"))返回24 。 符合預(yù)期
- getHoursOfDay(LocalDate.of(2014, 7, 15), ZoneId.of("Europe/Oslo"))也返回24 。
- 但這是一個有趣的版本: getHoursOfDay(LocalDate.of(2014, 3, 30), ZoneId.of("Europe/Oslo"))返回23 ! 這是夏令時。
- 同樣: getHoursOfDay(LocalDate.of(2014, 10, 26), ZoneId.of("Europe/Oslo"))也返回25
- 當然,下面一切都顛倒了: getHoursOfDay(LocalDate.of(2014, 10, 5), ZoneId.of("Australia/Melbourne"))得出23。
- 當然,除了昆士蘭州: getHoursOfDay(LocalDate.of(2014, 10, 5), ZoneId.of("Australia/Queensland")) => 24。
夏時制:程序員的禍根!
實行夏令時的目的是通過提供更多的帶燈工作時間來提高工人的生產(chǎn)率。 許多研究未能證明它可以按預(yù)期工作。
取而代之的是,當我檢查挪威的夏令時的歷史時,發(fā)現(xiàn)它是由高爾夫球手和蝴蝶收藏家(“鱗翅目動物”)游說的,以便他們在下班后能更好地追求自己的愛好。 因此,此博客文章的名稱。
大多數(shù)時候,您可以忽略夏令時。 但是,當您無法做到這一點時,它確實可以將您咬在背后。 例如:從夏令時更改為標準時間的那一天,電源計劃的每小時生產(chǎn)看起來是什么樣的? 同事給我的另一個例子:電視時間表。 事實證明,在秋天的額外一小時內(nèi),有些電視頻道根本就不愿意顯示節(jié)目。 否則他們將顯示同一小時的編程兩次。
Joda-Time API和現(xiàn)在的Java 8 time API java.time可以提供幫助。 如果正確使用。 這是顯示每小時值表的代碼:
void displayHourlyTable(LocalDate date, ZoneId zoneId) {ZonedDateTime startOfDay = date.atStartOfDay(zoneId);ZonedDateTime end = startOfDay.plusDays(1);for (ZonedDateTime current = startOfDay; current.isBefore(end); current = current.plusHours(1)) {System.out.println(current.toLocalTime() + ": " + current.toInstant());} }鑒于2014/10/26和奧斯陸,此打印:
00:00: 2014-10-25T22:00:00Z 01:00: 2014-10-25T23:00:00Z 02:00: 2014-10-26T00:00:00Z 02:00: 2014-10-26T01:00:00Z 03:00: 2014-10-26T02:00:00Z ....并在2014/3/30上打印:
00:00: 2014-03-29T23:00:00Z 01:00: 2014-03-30T00:00:00Z 03:00: 2014-03-30T01:00:00Z 04:00: 2014-03-30T02:00:00Z ....因此,如果您發(fā)現(xiàn)自己正在編寫這樣的代碼: for (int hour=0; hour<24; hour++) doSomething(midnight.plusHours(hour)); 您可能要重新考慮! 該代碼每年(可能)會中斷兩次。
從表面上看,時間是一個簡單的概念。 當您開始研究細節(jié)時,有一個原因java.time庫包含20個類(如果不計算子包的話)。 正確使用時,時間計算很簡單。 如果使用不當,時間計算看起來很簡單,但包含一些細微的錯誤。
下次,也許我應(yīng)該仔細考慮周數(shù)的一些要點。
翻譯自: https://www.javacodegeeks.com/2014/08/the-lepidopterists-curse-playing-with-java-time.html
總結(jié)
以上是生活随笔為你收集整理的鳞翅目动物的诅咒:玩java.time的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java EE:异步构造和功能
- 下一篇: linux设置ip地址的命令(linux