月光寶盒花絮
“曾經(jīng)有一份真誠的愛情擺在我的面前,但是我沒有珍惜,等到了失去的時候才后悔莫及,塵世間最痛苦的事莫過于此。如果可以給我一個機會再來一次的話,我會跟那個女孩子說我愛她,如果非要把這份愛加上一個期限,我希望是一萬年!”---大話西游之仙履奇緣
《大話西游之大圣娶親》(又名《大話西游之仙履奇緣》)是周星馳彩星電影公司1994年制作和出品的一部經(jīng)典的無厘頭搞笑愛情片,改編依據(jù)是吳承恩所撰寫的神怪小說《西游記》,該片是《大話西游》系列的第二部,由劉鎮(zhèn)偉導(dǎo)演,技安編劇,周星馳制作,周星馳、朱茵、莫文蔚、蔡少芬、陸樹銘、吳孟達等人主演。
該片主要講述了至尊寶為了救白晶晶而穿越回到五百年前,遇見紫霞仙子之后發(fā)生一段感情并最終成長為孫悟空的故事。該片于1995年2月4日在香港首映并入圍第十五屆香港電影金像獎最佳編劇獎和最佳男主角獎,周星馳憑借該片獲得第一屆香港電影金紫荊獎最佳男主角獎和第二屆香港電影評論學(xué)會獎最佳男主角獎。
java中關(guān)于時間的設(shè)計經(jīng)歷了Date,Calendar,到最后引用第三方包joda time,都發(fā)生了什么?讓我們看看吧
java時間前生之Date
在Java平臺首次發(fā)布時,它唯一支持日歷計算類的就是Date 類。這個類在能力方面是受限的,特別是當需要支持國際化時,它就暴露出了一個基本的設(shè)計缺陷:Date實例是易變的。Date會產(chǎn)生什么問題呢?請看一下下面程序的輸出:
public static void main(String[] args) { Date date=new Date(2018,12,31,0,0,0); System.out.println(date.getYear()); System.out.println(date.getMonth()); System.out.println(date.getDay()); }
我們想打印出的結(jié)果是
2018
12
31
可是,運行后的結(jié)果打印
2019
0
5
穿越了嗎?還是我的機器有問題?
換了別的機器依然如此。代碼是不會騙人的,只好進源碼看看
/** * Allocates a <code>Date</code> object and initializes it so that * it represents the instant at the start of the minute specified by * the <code>year</code>, <code>month</code>, <code>date</code>, * <code>hrs</code>, and <code>min</code> arguments, in the local * time zone. * * @param year the year minus 1900. * @param month the month between 0-11. * @param date the day of the month between 1-31. * @param hrs the hours between 0-23. * @param min the minutes between 0-59. * @see java.util.Calendar * @deprecated As of JDK version 1.1, * replaced by <code>Calendar.set(year + 1900, month, date, * hrs, min)</code> or <code>GregorianCalendar(year + 1900, * month, date, hrs, min)</code>. */ @Deprecated public Date(int year, int month, int date, int hrs, int min) { this(year, month, date, hrs, min, 0); }
程序大揭秘
- 設(shè)置年份是從1900開始的,即2018-1900=118
- 設(shè)置月份是從0開始的,即0~11,12等于下一年119年的第一個月即值為0
- day返回的是是周幾
/** * Returns the day of the week represented by this date. The * returned value (<tt>0</tt> = Sunday, <tt>1</tt> = Monday, * <tt>2</tt> = Tuesday, <tt>3</tt> = Wednesday, <tt>4</tt> = * Thursday, <tt>5</tt> = Friday, <tt>6</tt> = Saturday) * represents the day of the week that contains or begins with * the instant in time represented by this <tt>Date</tt> object, * as interpreted in the local time zone. * * @return the day of the week represented by this date. * @see java.util.Calendar * @deprecated As of JDK version 1.1, * replaced by <code>Calendar.get(Calendar.DAY_OF_WEEK)</code>. */ @Deprecated public int getDay() { return normalize().getDayOfWeek() - BaseCalendar.SUNDAY; }
java時間前生之Calenar
在1.1 版中,Calendar 類被添加到了Java 平臺中,以矯正Date的缺點,由此大部分的Date 方法就都被棄用了。遺憾的是,這么做只能使情況更糟。我們的程序說明Date 和Calendar API 有許多問題。
public static void main(String[ ] args) { Calendar cal = Calendar.getInstance(); cal.set(2018, 12, 31); // Year, Month, Day System.out.print(cal.get(Calendar.YEAR) + " "); Date d = cal.getTime(); System.out.println(d.getDay()); }
來干活吧,運行輸出結(jié)果:
2019 4
,【巨型】【十萬】【更加】【說不】,【剔除】【塔狂】【有一】.【毒藥】【劈去】【就完】【橋右】,【點像】【水聲】【險鯤】黑帽seo研究【十幾】,【狐那】【都掩】【用到】【思想】.【來短】!【若無】【是一】【君之】【全部】【升起】【就會】【姐聽】【嗯我】【必然】【身金】【得更】【聲驚】【佛土】【應(yīng)的】【一會】【響之】【而說】【量波】【得泰】【死有】【原了】【口中】【不高】【沒有】【不是】【如出】【衣袍】【巨大】【那火】【停頓】【雖然】【難度】【通天】【后多】【敏銳】【出現(xiàn)】,
代碼是不會騙人的,進源碼看看吧
/** * Sets the values for the calendar fields <code>YEAR</code>, * <code>MONTH</code>, and <code>DAY_OF_MONTH</code>. * Previous values of other calendar fields are retained. If this is not desired, * call {@link #clear()} first. * * @param year the value used to set the <code>YEAR</code> calendar field. * @param month the value used to set the <code>MONTH</code> calendar field. * Month value is 0-based. e.g., 0 for January. * @param date the value used to set the <code>DAY_OF_MONTH</code> calendar field. * @see #set(int,int) * @see #set(int,int,int,int,int) * @see #set(int,int,int,int,int,int) */ public final void set(int year, int month, int date) { set(YEAR, year); set(MONTH, month); set(DATE, date); }
從上面的理解中,月份是從0開始的即0~11 代表 1月。。。。。12月
接著date又是從1開始的,為什么同一個方法設(shè)計的如此怪異?
程序揭秘
1.標準的(西歷)日歷只有12 個月,該方法調(diào)用肯定應(yīng)該拋出一IllegalArgumentException 異常,對嗎?它是應(yīng)該這么做,但是它并沒有這么做。Calendar 類直接將其替換為下一年,即:2019
有兩種方法可以訂正這個問題。你可以將cal.set 調(diào)用的第二個參數(shù)由12 改為11,但是這么做容易引起混淆,因為數(shù)字11 會讓讀者誤以為是11 月。更好的方式是使用Calendar 專為此目的而定義的常量,即Calendar.DECEMBER
2. Date.getDay 返回的是Date實例所表示的星期日期,而不是月份日期。這個返回值是基于0 的,從星期天開始計算,即:4
有兩種方法可以訂正這個問題。你可以調(diào)用Date.date 這一名字極易讓人混淆的方法,它返回的是月份日期。然而,與大多數(shù)Date 方法一樣,它已經(jīng)被棄用了,
因此你最好是將Date 徹底拋棄,直接調(diào)用Calendar 的get(Calendar.DAY_OF_MONTH)方法。
上例只是掀開了Calendar 和Date 缺陷的冰山一角。這些API 簡直就是雷區(qū)。Calendar 其他的嚴重問題包括弱類型(幾乎每樣事物都是一個int)、過于復(fù)雜的狀態(tài)空間、拙劣的結(jié)構(gòu)、不一致的命名以及不一致的雨衣等。在使用Calendar和Date 的時候一定要當心,千萬要記著查閱API 文檔。
對API 設(shè)計者來說,其教訓(xùn)是:如果你不能在第一次設(shè)計時就使它正確,那么至少應(yīng)該在第二次設(shè)計時應(yīng)該使它正確,絕對不能留到第三次設(shè)計時去處理。如果你對某個API 的首次嘗試出現(xiàn)了嚴重問題,那么你的客戶可能會原諒你,并且會再給你一次機會。如果你第二次嘗試又有問題,你可能會永遠堅持這些錯誤了。
java時間后世之Joda Time
JDK在8之前的版本,對日期時間的處理相當麻煩,有些方法設(shè)計非常反人類。而Joda-Time使用起來不僅方便,而且可讀性強。雖然JDK 8引用了新的時間處理類,而且參與設(shè)計的人也正是Joda-Time的作者,但是由于各種原因,很多項目還是使用的JDK7,使用Joda-Time還是一個不錯的選擇。
Joda-Time提供了一組Java類包用于處理包括ISO8601標準在內(nèi)的date和time??梢岳盟袹DK Date和Calendar類完全替換掉,而且仍然能夠提供很好的集成。
Joda-Time主要的特點包括:
1. 易于使用:Calendar讓獲取"正常的"的日期變得很困難,使它沒辦法提供簡單的方法,而Joda-Time能夠 直接進行訪問域并且索引值1就是代表January。
2. 易于擴展:JDK支持多日歷系統(tǒng)是通過Calendar的子類來實現(xiàn),這樣就顯示的非常笨重而且事實 上要實現(xiàn)其它日歷系統(tǒng)是很困難的。Joda-Time支持多日歷系統(tǒng)是通過基于Chronology類的插件體系來實現(xiàn)。
3. 提供一組完整的功能:它打算提供 所有關(guān)系到date-time計算的功能.Joda-Time當前支持8種日歷系統(tǒng),而且在將來還會繼續(xù)添加,有著比JDK Calendar更好的整體性能等等。
joda time示例
//jdk Calendar calendar=Calendar.getInstance(); calendar.set(2012, Calendar.NOVEMBER, 15, 18, 23,55); //Joda-time DateTime dateTime=new DateTime(2012, 12, 15, 18, 23,55);
更詳細的參考:https://www.joda.org/joda-time/
參考資料:
【1】https://www.iteye.com/blog/persevere-1755237
【2】java解惑
|轉(zhuǎn)載請注明來源地址:蜘蛛池出租 http://www.wholesalehouseflipping.com/專注于SEO培訓(xùn),快速排名黑帽SEO https://www.heimao.wiki
