日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java的日期API真烂

發布時間:2025/3/19 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java的日期API真烂 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
記得在我剛學Java的時候,真是搞不清楚Date和Calendar這兩個類,后來我漸漸知道,原來不能全怪我啊,Java日期API之爛是公認的(不妨參見這篇文章,Tiago Fernandez做過一個投票,就是要選舉最爛的Java API,結果Java日期API排行第二,僅次于臭名遠揚的EJB2,嘿嘿)。 蛋疼的java.sql.Date 只有Date和Calendar搞定一切嗎?那還好啊。當然不是!光Date就有java.util.Date和java.sql.Date,而且關系是java.sql.Date extends java.util.Date。為了把前者轉成后者,我寫了這樣的代碼:
12 Date date = new Date(); java.sql.Date d = new java.sql.Date(date.getTime());
居然不支持Date參數的構造器,我只好傳入long類型的時間。接下去,我嘗試把當前小時數取出來:
1 System.out.println(d.getHours());
悲劇出現了:
12 Exception in thread "main" java.lang.IllegalArgumentException at java.sql.Date.getHours(Date.java:177)
一看源碼,坑爹啊:
123 public int getHours() { throw new java.lang.IllegalArgumentException(); }
在java.util.Date里面好好的方法怎么變成這個鳥樣了? 方法注釋給出了說明: This method is deprecated and should not be used because SQL Date values do not have a time component. 也就是說,java.sql.Date是SQL中的單純的日期類型,哪會有時分秒啊?我覺得它根本不應該設計成java.util.Date的子類。如果你把java.sql.Date通過JDBC插入數據庫,你會發現時分秒都丟失了,因此如果你同時需要日期和時間,你應該使用Timestamp,它也是java.util.Date的子類。 另外還有一個java.util.Date的子類叫Time,java.sql包下面的Date、Time和Timestamp可以放在一起記憶。Date只包含年月日信息、Time只包含時分秒信息,而Times則包含時間戳的完整信息。 現在知道人家拋出IllegalArgumentException的用心良苦了吧…… 坑爹的year和month 看看Date類的構造器:
1 public Date(int year, int month, int day)
長得并不奇葩嘛。 好,現在我要輸出2012年的1月1號了:
12 Date date = new Date(2012,1,1); System.out.println(date);
結果,你傻眼了:
1 Thu Feb 01 00:00:00 CST 3912
等等,這是啥?3192年? 原來實際年份是要在你的年份參數上加上個起始年份1900。 更坑爹的是,月份參數我不是給了1嗎?怎么輸出二月(Feb)了? Date里面的月份居然是用0~11表示的,換句話說,一月用0來表示,二月用1來表示。如果不用常量或者枚舉,很容易踩到坑里去,對不對? 后來發現Go語言的time.Date方法,對于月份做了個惡心但是不容易坑人的處理(看奇葩的月份參數啊):
1 func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location)
我甚至懷疑Google這樣處理是在用極端的方法鄙視Java(另,據我所知,JavaScript好像也是這樣的,月份從0開始)…… 嘗試Joda吧 最開始的時候,Date既要承載日期信息,又要做日期之間的轉換,還要做不同日期格式的顯示,職責較繁雜,從JDK 1.1 開始,這三項職責分開了:
  • 使用Calendar類實現日期和時間字段之間轉換;
  • 使用DateFormat類來格式化和分析日期字符串;
  • 而Date只用來承載日期和時間信息。
  • 原有Date中的相應方法已廢棄。不過,無論是Date,還是Calendar,都用著太不方便了,這是API沒有設計好的地方。 比如Calendar的getInstance方法,并未提供一個指定年月日和時分秒的重載方法,每次要指定特定的日期時間,必須先獲取一個表示當前時間的Calendar實例,再去設值,比如:
    123 Calendar c = Calendar.getInstance();c.set(2012, 0, 1, 11, 11, 11); System.out.println(c.getTime());

    轉載于:https://blog.51cto.com/daheyuan/1140096

    總結

    以上是生活随笔為你收集整理的Java的日期API真烂的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。