posts - 189,comments - 115,trackbacks - 0

          軟件,讓世界變平


          [轉貼]
          http://gocom.primeton.com/modules/techresource/article1075.htm
          《世界是平的》作者弗里德曼


          500年前哥倫布發現美洲大陸,證明地球是圓的;21世紀初美國《紐約時報》專欄作家弗里德曼來到亞洲后感慨:世界是平的!

          無獨有偶,經過重重篩選和征集,2008北京奧運終于選出了這樣的口號:同一個世界,同一個夢想。

          因為世界從沒有像現在這么小過,也從來沒有像現在這么近過。

          幾千年前,老子的夢想——小國寡民,雞犬之聲相聞,老死不相往來,轟然倒塌。

          全球化的利器就是網絡和軟件。

          其中,軟件,正以不可思議的無形力量,抹平了世界。

          時間是“平”的

          軟件讓世界變平。“平”的意思一旦到了漢語中,就衍生出了豐富的含義和引申。至少,它包含了三個緯度:時間、空間和精神。

          所謂時間緯度的“平”,就是企業提升效率,從傳統管理轉向新型管理。
          因此乎,小蝦米和大鯨魚可以平起平坐了,小企業可以公然和大企業搶生意。從前的企業要發展20年才能國際化,今天創業第2天就跨國的比比皆是;中國制造和印度外包正以令人眩目的速度崛起,中國和亞洲成為新的全球化中心。
          其中,企業管理類軟件起到了重要的作用,它的主要功能就是科學管理,提升效率。

          自18世紀產業革命以來,手工業作坊向工廠生產的方向發展,出現了制造業。隨之而來,所有企業幾乎無一例外地追求著基本相似的營運目標,即企業利潤最大化。如何合理制訂生產計劃、有效控制成本、充分利用設備、管理庫存等等,對企業具有生死存亡的意義。于是,各種企業管理理論和實踐也就應運而生。50年代中期,計算機的商業化應用開辟了企業管理信息處理的新紀元。這對企業管理所采用的方法產生了深遠的影響。

          市場競爭激烈程度、市場競爭范圍以及市場與客戶需求變化速度,這三個因素的不斷變化,推動了企業管理軟件從早期的MRP經歷了閉環MRP和MRPⅡ,一直發展到今天的ERP,并朝著未來的方向進一步發展。

          在經歷了“上ERP是找死,不上ERP是等死”這樣的恐懼和猶豫之后,傳統企業審慎而熱情地投入了這一場管理的革命。他們失去的是傳統的管理弊病,得到的,是自己和管理軟件企業的共贏。



          江蘇雪豹集團董事長兼總經理 孫秉忠指著工廠前面的別墅說:“我們要用可以買下前面一大片房子的錢來投入雪豹信息化”



          雪豹集團是一家生產各種日化用、藥用噴霧泵(閥)并配套微型鋁罐、塑料瓶的民營企業。這樣的企業在江浙一帶特別常見。

          作為一個手工作坊發展起來的企業,雪豹集團的管理是傳統的粗放管理。手工作業,無法實時了解訂單、回款狀況,而且業務繁多,時常會訂單、發貨出錯。這導致雪豹每年都要造成三四百萬元的損失。

          2004年8月中旬,總經理召集所有工人,指著工廠前面的別墅說:“我們要用可以買下前面一大片房子的錢來投入雪豹信息化,要用超過10%的凈資產來投入信息化!唯一的目的是使雪豹脫胎換骨,從傳統的江陰民企脫胎換骨成國際一流的現代企業。”

          一年之后,雪豹的信息化系統已經全面覆蓋了企業的各個管理領域。雪豹有很多訂單是出口的,現在他們也能實時了解最新的訂單情況,國內國外,雖然差著萬里,但卻沒有差別。

          世界500強的國外企業,花了近百年的時間邁入信息時代,而江蘇一個小小的民營罐頭廠,一年之內也進入了信息時代的門檻。

          現在,ERP不但是可以運行在電腦上的,還可以是運行在手機中的。燕京啤酒的經銷商每天都可以將銷量信息直接發送總部,這些信息可以幫助該公司及時了解產品的銷售、庫存狀況,從而合理安排生產、貨物調配及運輸業務。
          除了企業管理軟件之外,協同軟件也在抹平時間的緯度中大放異彩。
          時間,似乎在后來者的面前一下子跑了起來,用幾年的時間去追趕近百年的歷程,然后,把他們一同帶入了市場競爭的起跑線。

          空間是“平”的

          所謂空間緯度的“平”,就是沒有了空間的阻隔,千里之外,近在眼前。

          即時通訊軟件改變了世界。即時通訊的歷史并不久遠,但是它一誕生,就立即受到網民的喜愛,并風靡全球。在它的發展史上,以色列人功不可沒。1996年7月,四位以色列籍的年輕人成立了Mirabilis公司,同年11月,推出了全世界第一款即時通訊軟件ICQ,取意為“我在找你”——“ISeekYou”,簡稱ICQ。當時開發的這款即時通訊軟件,其目的很簡單,只是為了連接在同一個服務器上的用戶能夠相互交流。可誰也沒有想到,就是這樣一個小小的軟件,改變了整個互聯網的發展,成為許多商家你爭我奪的商業地盤。

          即時通訊軟件的優點是毋庸置疑的,只要通信雙方擁有同樣的軟件,只需打開小小的窗口就能與對方進行通信。不管對方是在世界的哪一端。不知不覺間,即時通訊軟件成了人們在網上聯絡的大紅大紫的寵兒,幾乎每個網上用戶都有了自己的即時通訊賬號,甚至,即時通訊的賬號成為了網絡上每個用戶的必備ID。

          坐地日行八萬里,巡天遙看一千河,從神話中成為了現實。

          1999年,騰訊公司創始人馬化騰將中國的第一個即時通訊工具Oicq推向了互聯網舞臺。六年間,騰訊小企鵝的飛速發展成為互聯網應用中最引人注目的現象之一。今天,每個上網的人幾乎必備騰訊QQ、雅虎通、MSN等即時通訊軟件。隨著騰訊QQ在中國的巨大成功,互聯網的本質得到人們更多認識,一個巨大的以即時通訊為核心的互聯網應用產業也在逐漸形成之中。

          即時通訊的崛起,不僅僅給人們帶來了通信的方便,更重要的是它正滲入人們生活的點點滴滴,改變了人們的生活。至此,即時通訊產品已不再被定義為一個簡單的溝通工具,而是一個信息資訊、交流互動、休閑娛樂的平臺,語音、視頻、音樂點播、網絡游戲、在線交易、BBS、blog、信息共享等新的應用都基于這個平臺開展,并正以前所未有的速度改變著人們的生活方式,也創造著更廣闊的互聯網產業前景。

          精神是“平”的

          所謂精神緯度的“平”,就是精神上的平等。

          杰佛遜在《獨立宣言》中說,人人生而平等。而現實世界中,人其實生而不平等,但軟件卻可以讓世界是公平而開放的,而且一切皆有可能。

          這種“平”,首先是一種改變國家軟件產業的平等。
          面對軟件游戲規則被國外掌握的困境,只要敢想,就可以找到平等對話的機會。

          長期以來,中國軟件在與國外軟件的競爭中往往處于被動,缺乏戰略上的競爭優勢。無論從國家安全還是產業角度,中國都需要一場場在軟件領域的勝利突圍。這不僅是必要的,而且是必須的。

          面向構件就是其中一種選擇。面向構件是軟件美國在痛定思痛之后不得不作出的選擇。而中國在此方面有著無以倫比的優勢。因為我們無需推倒重來,我們沒有那么多的廢墟和負擔,我們有的,只是建造一個美麗新世界的勇氣和果敢。

          面向構件的模式,可以讓中國在技術上幾乎處在最領先的起跑線上。本土的軟件企業理當有實力解開困擾很多中國企業的軟件死結,同時在解開中國企業級軟件死結的背后所展現的一個重大機會似乎更讓人激動:面向構件的應用基礎平臺完全可以在這個領域形成本土的企業群,并成就中國的軟件產業的國際大企業夢想。

          這種“平”,還是一種打破壟斷力量的平等。

          當諾大一個軟件世界掌握在一家公司之手,為他所左右時,軟件開發人員想不通,自己開發的東西竟然成了的壟斷工具,成了軟件業發展的枷鎖。為了改變這一局勢,開發人員自動成立了“開放源代碼”組織,旨在倡導“自由開放”的社會精髓,更加集中地促進軟件業的快速發展。Linux就是最杰出的代表,幾乎成了開放源代碼的代名詞。Linux以其自由開放的特性而深得大家的喜愛。當“小企鵝”在大家的一片歡呼聲中茁壯成長時,迎面而來的就是一個紛繁復雜的商業社會。

          開放源代碼一出世就與知識產權保護格格不入,倡導自由開放的“開源”在倍受世人寵愛的同時,其成長注定要經歷急風暴雨,除非它停留在口頭上或抽屜里。然而,后面的假設對Linux來說已經時過境遷,企鵝已經成為了時代的勇士。這也許是時代的一種必然選擇,因為市場經濟必將打破各種壟斷,無論這種壟斷是國有的還是行業的;無論打破壟斷的方式是私營還是公有,是個人還是國家,社會都將朝著公平競爭的時代邁進。

          Linux受到的支持越來越多,從倡導、支持、擁護到命令、立法、自創;從歐洲到亞洲再到非洲;從個人到公司再到政府,甚至包括不信奉市場經濟原則的國家,都在立法規定或行政命令,要求政府必須使用開源軟件。

          盡管Linux和開放源代碼算不上是一種突破性的技術,Linux稱其量也只是Unix的一種變種或分枝,但開放源代碼打破了傳統的軟件觀念,開創了一種全新的軟件模式。Linux的突破作用不僅改變了整個軟件經濟格局,更是帶來了自由開放公平的精神,它對整個社會和人類的貢獻不亞于一項偉大技術的成就。
          這種“平”,更是一種承載弱勢群體夢想的平等。

          當一個貧困地區的孩子,也能通過視頻、音頻軟件接受最新的教育,通過在線考試系統提交試卷接受教育考評,軟件,就是他走出大山的明燈。當一個盲人通過讀屏軟件也能暢想大千世界,遨游網絡的時候,軟件,就是他看向世界的雙眼。當殘疾人士坐在輪椅上,一樣能通過photoshop、flash等軟件設計作品,自力更生甚至創業時,軟件是他走向成功人生的雙足。

          不敢想的可以想,不敢做的可以做,只要你想,一切皆有可能。幾乎所有的工具軟件都承載了弱勢群體自由飛翔的翅膀。

          真實的世界在有些人眼里也許不是平的,它可能是傾斜的,資源的偏向有很大的差距。但是軟件的力量正在蔓延開去,如洪流一樣席卷全球,而且,它正是消除資源分配不公的良藥。

          弗里德曼說,小時候爸媽說:“兒子啊,乖乖把飯吃完,因為中國跟印度的小孩沒飯吃。”現在他自己則說:“女兒啊,乖乖把書念完,因為中國跟印度的小孩正等著搶你的飯碗。”

          美國的孩子,和中國、印度的孩子沒了差別,這種對等,就是支撐世界進一步全球化的真正信仰。

          尼采說,兩山最短的距離,是山峰與山峰之間的距離。

          那么他一定沒想到今天,世界最短的距離,只是一個軟件安裝時間的距離。



          Java的時間處理(續<計算Java時間>)

          學習在java中計算基本的時間段
          概述
          如果你知道怎樣在java中使用日期,那么使用時間和它才不多一樣簡單。這篇文章告訴你怎樣把他們的差別聯系起來。Robert Nielsen還告訴你怎樣使用java來計算抵達航班和制造過程的時間。
          作者:Robert Nielsen
          翻譯:Cocia Lin



          這篇文章是在我發表過的<計算Java時間>(譯者:已經翻譯完成)的基礎上的。在這里,我列出那篇文章幾個你應該熟悉得關鍵點。如果這幾點你不太清楚,我建議你讀一下<計算Java時間>,了解一下。
          1. Java計算時間依靠1970年1月1日開始的毫秒數.
          2. Date類的構造函數Date()返回代表當前創建的時刻的對象。Date的方法getTime()返回一個long值在數值上等于1970年1月1日之前或之后的時刻。
          3. DateFormat類用來轉換Date到String,反之亦然。靜態方法getDateInstance()返回DateFormat的缺省格式;getDateInstance(DateFormat.FIELD)返回指定的DateFormat對象格式。Format(Date d)方法返回String表示日期,例如"January 1,2002."反過來,parse(String s)方法返回以參數字符串表示的Date對象。
          4. format()方法返回的字符串格式根據不同地區的時間設置而有所不同。
          5. GregorianCalendear類有兩個重要的構造函數:GregorianCalerdar(),返回代表當前創建時間的對象;GregorianCalendar(int year,int month,int date)返回代表任意日期的對象。GregorianCalendar類的getTime()方法返回日期對象。Add(int field,int amount)方法通過加或減時間單位,象天數,月數或年數來計算日期。
          GregorianCalendar和 時間
          兩個GregorianCalendar的構造函數可以用來處理時間。前者創建一個表示日期,小時和分鐘的對象:

          GregorianCalendar(int year, int month, int date, int hour, int minute)

          第二個創建一個表示一個日期,小時,分鐘和秒:

          GregorianCalendar(int year, int month, int date, int hour, int minute, int second)

          首先,我應該提醒一下,每一個構造函數需要時間信息中的日期信息(年,月,日)。如果你想說2:30 p.m.,你必須指出日期。
          同樣,每一個GregorianCalendar構造函數創建一個在時間上使用毫秒計算的對象。所以,如果你的構造函數只提供年,月,日參數,那小時,分鐘,秒和毫秒的值將被置0.
          DateFormat和時間
          你可以使用靜態方法getDateTimeInstance(int dateStyle,int timeStyle)來建立DateFormat對象來顯示時間和日期。這個方法表明你想要的日期和時間格式。如果你喜歡使用缺省格式,可以使用getDateTimeInstance()來代替它。
          你可以使用靜態方法getTimeInstance(int timeStyle)創建DateFormat對象來顯示正確的時間。
          下面的程序示范了getDateTimeInstance()和getTimeInstance()怎樣工作:

          import java.util.*;
          import java.text.*;

          public class Apollo {
          public static void main(String[] args) {
          GregorianCalendar liftOffApollo11 = new GregorianCalendar(1969, Calendar.JULY, 16, 9, 32);
          Date d = liftOffApollo11.getTime();
          DateFormat df1 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
          DateFormat df2 = DateFormat.getTimeInstance(DateFormat.SHORT);
          String s1 = df1.format(d);
          String s2 = df2.format(d);
          System.out.println(s1);
          System.out.println(s2);
          }
          }

          在我的電腦上,上面的程序顯示如下:

          Jul 16, 1969 9:32:00 AM
          9:32 AM
          (輸出根據你所在得地區有所不同)

          計算時間間隔
          你可能有時需要計算過去的時間;例如,給你開始和結束時間,你想知道制造流程的持續時間。一個出租公司按小時或天數出租東西,計算時間對他們也很有用。同樣的,在金融界,經常需要計算重要的支付時間。
          將問題復雜化,人類至少是用兩種方法計算時間。你可以說一天已經結束當24小時過去了,或者日歷從今天翻到明天。我們將討論我們想到的這兩種情況。
          時間段,情況 1:嚴格時間單位
          在這種情況中,只有24小時過去,這天才過去,60分鐘過去,這個小時才過去,60秒過去,這個分鐘才過去,以此類推。在這個方法中,23小時的時間將被認為是0天。
          使用這種方法計算時間段,你從計算過去的毫秒開始。為了做到這一點,首先轉換每個日期為從1970年1月1日起得毫秒數。你可以從第二個毫秒值中減去第一個毫秒值。這里有一個簡單的計算:

          import java.util.*;

          public class ElapsedMillis {
          public static void main(String[] args) {
          GregorianCalendar gc1 = new GregorianCalendar(1995, 11, 1, 3, 2, 1);
          GregorianCalendar gc2 = new GregorianCalendar(1995, 11, 1, 3, 2, 2);
          // the above two dates are one second apart
          Date d1 = gc1.getTime();
          Date d2 = gc2.getTime();
          long l1 = d1.getTime();
          long l2 = d2.getTime();
          long difference = l2 - l1;
          System.out.println("Elapsed milliseconds: " + difference);
          }
          }

          上面的程序打印如下:

          Elapsed milliseconds: 1000

          這個程序也帶來一點混淆。GregorianCalendar類的getTime()返回一個Date對象,Date類的getTime()方法返回從1970年1月1日到這個時間的long類型的毫秒數值。雖然他們的方法名字相同,返回值卻不一樣!
          下面的程序片斷用簡單的整數除法轉換毫秒到秒:

          long milliseconds = 1999;
          long seconds = 1999 / 1000;

          這種方法舍去小數部分轉換毫秒到秒,所以1,999毫秒等于1秒,2,000毫秒等于2秒。
          計算更大的單位-例如天數,小時和分鐘-給定一個時間數值,可以使用下面的過程:
          1. 計算最大的單位,減去這個數值的秒數
          2. 計算第二大單位,減去這個數值的秒數
          3. 重復操作直到只剩下秒
          例如,如果你的時間的10,000秒,你想知道這個數值相應的是多少小時,多少分鐘,多少秒,你從最大的單位開始:小時。10,000除以3600(一個小時的秒數)得到小時數。使用整數除法,答案是2小時(整數除法中小數舍去)計算剩下的秒數,10,000-(3,600 x 2) = 2,800秒。所以你有2小時和2,800秒。
          將2,800秒轉換成分鐘,2,800除以60。使用整數除法,答案是46。2,800 - (60 x 46) = 40秒。最后答案是2小時,46分,40秒。
          下面的Java程序使用上面的計算方法:

          import java.util.*;

          public class Elapsed1 {
          public void calcHMS(int timeInSeconds) {
          int hours, minutes, seconds;
          hours = timeInSeconds / 3600;
          timeInSeconds = timeInSeconds - (hours * 3600);
          minutes = timeInSeconds / 60;
          timeInSeconds = timeInSeconds - (minutes * 60);
          seconds = timeInSeconds;
          System.out.println(hours + " hour(s) " + minutes + " minute(s) " + seconds + " second(s)");
          }

          public static void main(String[] args) {
          Elapsed1 elap = new Elapsed1();
          elap.calcHMS(10000);
          }
          }

          輸出結果如下:

          2 hour(s) 46 minute(s) 40 second(s)

          上面的程序甚至在時間少于一個小時也可以正確的計算小時數。例如,你用上面的程序計算1,000秒,輸出入下:
          0 hour(s) 16 minute(s) 40 second(s)
          舉一個現實世界的例子,下面的程序計算阿波羅11飛到月球使用得時間:

          import java.util.*;

          public class LunarLanding {

          public long getElapsedSeconds(GregorianCalendar gc1, GregorianCalendar gc2) {
          Date d1 = gc1.getTime();
          Date d2 = gc2.getTime();
          long l1 = d1.getTime();
          long l2 = d2.getTime();
          long difference = Math.abs(l2 - l1);
          return difference / 1000;
          }

          public void calcHM(long timeInSeconds) {
          long hours, minutes, seconds;
          hours = timeInSeconds / 3600;
          timeInSeconds = timeInSeconds - (hours * 3600);
          minutes = timeInSeconds / 60;
          System.out.println(hours + " hour(s) " + minutes + " minute(s)" );
          }

          public static void main(String[] args) {
          GregorianCalendar lunarLanding = new GregorianCalendar(1969, Calendar.JULY, 20, 16, 17);
          GregorianCalendar lunarDeparture = new GregorianCalendar(1969, Calendar.JULY, 21, 13, 54);
          GregorianCalendar startEVA = new GregorianCalendar(1969, Calendar.JULY, 20, 22, 56);
          GregorianCalendar endEVA = new GregorianCalendar(1969, Calendar.JULY, 21, 1, 9);

          LunarLanding apollo = new LunarLanding();

          long eva = apollo.getElapsedSeconds(startEVA, endEVA);
          System.out.print("EVA duration = ");
          apollo.calcHM(eva);

          long lunarStay = apollo.getElapsedSeconds(lunarLanding, lunarDeparture);
          System.out.print("Lunar stay = ");
          apollo.calcHM(lunarStay);
          }
          }

          上面程序輸出如下:

          EVA duration = 2 hour(s) 13 minute(s)
          Lunar stay = 21 hour(s) 37 minute(s)

          目前為止,我們計算的基礎公式是這樣的:1分鐘=60秒,1小時=60分,1天=24小時。
          "1個月=?天,1年=?天"怎么辦?
          月份的天數有28,29,30,31;一年可以是365或366天。因此,當你試圖計算嚴格單位的月份和年時,問題就產生了。例如,如果你使用月份的平均天數(近似30.4375),并且計算下面的時間間隔:

          * July 1, 2:00 a.m. to July 31, 10:00 p.m.
          * February 1, 2:00 a.m. to February 29, 10:00 p.m.

          第一個計算結果是1個月;第二個結果是0個月!
          所以,在計算嚴格單位時間的月份和年份是要想好。
          時間段,情況 2:時間單位變化
          時間單位的變化相當的簡單:如果你要統計天數,你可以簡單的統計日期變化次數。例如,如果某事15日開始,17日結束,經過2天。(日期先是便到16,再到17)同樣的,一個步驟下午3:25開始,4:10 p.m結束,歷時1個小時,因為小時數值變了一次(從3到4)。
          圖書館經常使用這種習慣計算時間。例如,如果你從圖書館接一本書,我不能占有這本書最少24小時,會認為圖書館這樣才給你算一天。而是,我的賬號上記錄我借書的日期。日期以變成下一天,我就已經結這本書一天了,即使總計不足24小時。
          當使用單位的變化來計算時間段,通常感覺計算的時間沒有多于一個時間單位。例如,如果9:00 p.m.我借了一本圖書館的書,第二天中午還回去,我能算出我借了這本書一天了。可是,有一種感覺在問:"1天和幾個小時呢?"這本說總計借出15個小時,答案是一天還差9個小時呢?因此,這篇文章里,我將以一個時間單位變化計算時間。
          單位變化的時間算法
          這是你怎樣計算兩個日期的時間變化:
          1. 制作兩個日期的拷貝。Close()方法能制作拷貝。
          2. 使用日期拷貝,將所有的小于時間單位變化的部分設置成它的最小單位。例如,如果計算天數,那么將小時,分鐘,秒和毫秒設置成0。這種情況中,使用clear()方法將時間值設置稱他們各自的最小值。
          3. 取出較早的日期,將你要計算的單位加1,重復直到兩個日期相等。你加1的次數就是答案。可以使用before()和after()方法,他們返回boolean值,來判斷是否一個日期在另一個日期之前或之后。
          下面的類的方法用來計算天數和月數。

          import java.util.*;

          public class ElapsedTime {

          public int getDays(GregorianCalendar g1, GregorianCalendar g2) {
          int elapsed = 0;
          GregorianCalendar gc1, gc2;

          if (g2.after(g1)) {
          gc2 = (GregorianCalendar) g2.clone();
          gc1 = (GregorianCalendar) g1.clone();
          }
          else {
          gc2 = (GregorianCalendar) g1.clone();
          gc1 = (GregorianCalendar) g2.clone();
          }

          gc1.clear(Calendar.MILLISECOND);
          gc1.clear(Calendar.SECOND);
          gc1.clear(Calendar.MINUTE);
          gc1.clear(Calendar.HOUR_OF_DAY);

          gc2.clear(Calendar.MILLISECOND);
          gc2.clear(Calendar.SECOND);
          gc2.clear(Calendar.MINUTE);
          gc2.clear(Calendar.HOUR_OF_DAY);

          while ( gc1.before(gc2) ) {
          gc1.add(Calendar.DATE, 1);
          elapsed++;
          }
          return elapsed;
          }

          public int getMonths(GregorianCalendar g1, GregorianCalendar g2) {
          int elapsed = 0;
          GregorianCalendar gc1, gc2;

          if (g2.after(g1)) {
          gc2 = (GregorianCalendar) g2.clone();
          gc1 = (GregorianCalendar) g1.clone();
          }
          else {
          gc2 = (GregorianCalendar) g1.clone();
          gc1 = (GregorianCalendar) g2.clone();
          }

          gc1.clear(Calendar.MILLISECOND);
          gc1.clear(Calendar.SECOND);
          gc1.clear(Calendar.MINUTE);
          gc1.clear(Calendar.HOUR_OF_DAY);
          gc1.clear(Calendar.DATE);

          gc2.clear(Calendar.MILLISECOND);
          gc2.clear(Calendar.SECOND);
          gc2.clear(Calendar.MINUTE);
          gc2.clear(Calendar.HOUR_OF_DAY);
          gc2.clear(Calendar.DATE);

          while ( gc1.before(gc2) ) {
          gc1.add(Calendar.MONTH, 1);
          elapsed++;
          }
          return elapsed;
          }
          }

          你可以在上面的類中補充另外的方法來處理小時和分鐘。同樣,計算時間段的算法能更高效一些,尤其是時間相隔很長。可是,作為介紹目的,這個算法有短小和簡單的優勢。
          下面的例子使用ElapsedTime類來計算兩個日期之間的天使,而后是月數:

          import java.util.*;

          public class Example {
          public static void main(String[] args) {
          GregorianCalendar gc1 = new GregorianCalendar(2001, Calendar.DECEMBER, 30);
          GregorianCalendar gc2 = new GregorianCalendar(2002, Calendar.FEBRUARY, 1);

          ElapsedTime et = new ElapsedTime();
          int days = et.getDays(gc1, gc2);
          int months = et.getMonths(gc1, gc2);

          System.out.println("Days = " + days);
          System.out.println("Months = " + months);
          }
          }

          當計算時,上面的程序可能有用,例如,最近的航班。它顯示下面的輸出:

          Days = 33
          Months = 2

          (OK,關于航班的計算有些夸張;這個天數算法很適合像圖書館借書這樣的應用,你看到了她怎樣工作)
          告誡
          在進行時間工作時要謹慎:你看到的時間段的例子,你精確仔細的考慮非常重要。本文介紹了兩種通常計算時間段的想法,但是人們能想到的時間段的計算方法僅僅受到人類想象力的限制。
          所以,當寫一個Java程序的時候,確信你的精確度能讓使用和以來這些程序的人滿意。同樣,徹底的測試程序對處理時間的程序非重重要。
          總結
          本文是在我的前一篇文章 Java時間計算介紹怎樣使用GregorianCalendar 和 DateFormat類處理時間問題的基礎上的。你已經看到了兩種方法來思考時間段問題和兩種相應的途徑使用Java來處理時間問題。這里提供的信息,很基礎,提供給你一個在Java中處理時間問題的有力工具。

          關于作者
          Robert Nielsen是SCJP。他擁有碩士學位,專攻計算機教育,并且在計算機領域執教多年。他也在各樣的雜志上發表過很多計算機相關的文章。
          關于譯者
          Cocia Lin(cocia@163.com)是程序員。它擁有學士學位,現在專攻Java相關技術,剛剛開始在計算機領域折騰。



          java類Timer和TimerTask的使用
          寬 發表于 2007-2-2 10:15:00

          這兩個類使用起來非常方便,可以完成我們對定時器的絕大多數需求

               Timer類是用來執行任務的類,它接受一個TimerTask做參數

               Timer有兩種執行任務的模式,最常用的是schedule,它可以以兩種方式執行任務:1:在某個時間(Data),2:在某個固定的時間之后(int delay).這兩種方式都可以指定任務執行的頻率.看個簡單的例子:



          import java.io.IOException;
          import java.util.Timer;

          public class TimerTest {
                 
              
          public static void main(String[] args){
                  Timer timer 
          = new Timer();
                  timer.schedule(
          new MyTask(), 10002000);//在1秒后執行此任務,每次間隔2秒,如果傳遞一個Data參數,就可以在某個固定的時間執行這個任務.
                  
          while(true){//這個是用來停止此任務的,否則就一直循環執行此任務了
                      
          try {
                          
          int ch = System.in.read();
                          
          if(ch-'c'==0){
                              timer.cancel();//使用這個方法退出任務
                              
                          }

                      }
           catch (IOException e) {
                          
          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }

                  }

              }

              
              
              
          static class MyTask extends java.util.TimerTask{

                  @Override
                  
          public void run() {
                      
          // TODO Auto-generated method stub
                      System.out.println("________");
                  }

              }

              
              
              
              
          }



              如果你使用的是JDK 5+,還有一個scheduleAtFixedRate模式可以用,在這個模式下,Timer會盡量的讓任務在一個固定的頻率下運行,舉例說明:在上面的例子中,我們想讓MyTask在1秒鐘后,每兩秒鐘執行一次,但是因為java不是實時的(其實java實時性很差.....),所以,我們在上個程序中表達的原義并不能夠嚴格執行.如果我們調用的是scheduleAtFixedRate,那么,Timer會盡量讓你的Task執行的頻率保持在2秒一次.運行上面的程序,假設使用的是scheduleAtFixedRate,那么下面的場景就是可能的:1秒鐘后,MyTask 執行一次,因為系統繁忙,之后的2.5秒后MyTask 才得以執行第二次,然后,Timer記下了這個延遲,并嘗試在下一個任務的時候彌補這個延遲,那么,1.5秒后,MyTask 將執行的三次."以固定的頻率而不是固定的延遲時間去執行一個任務"

          果然很方便吧^_^

           

           

          下面給出一個復雜點的例子,其中告訴大家怎么退出單個TimerTask,怎么退出所有Task

          package MyTimerTest;

          import java.io.IOException;
          import java.util.Timer;


          /*
           * 本類給出了使用Timer和TimerTaske的主要方法,其中包括定制任務,添加任務
           * 退出任務,退出定時器.
           * 因為TimerTask的status域是包級可訪問的,所以沒有辦法在java.util.包外
           * 得到其狀態,這對編程造成一些不便 .我們不能判斷某個Task的狀態了.
           * 
           
          */


          public class TimerTest {

              
          public static void main(String[] args) {
                  Timer timer 
          = new Timer();
                  MyTask myTask1 
          = new MyTask();
                  MyTask myTask2 
          = new MyTask();
                  myTask2.setInfo(
          "myTask-2");
                  timer.schedule(myTask1, 
          10002000);
                  timer.scheduleAtFixedRate(myTask2, 
          20003000);
                  
          while (true{
                      
          try {
                          
          byte[] info = new byte[1024];
                          
          int len = System.in.read(info);
                          String strInfo 
          = new String(info, 0, len, "GBK");//從控制臺讀出信息
                          if (strInfo.charAt(strInfo.length() - 1== ' '{
                              strInfo 
          = strInfo.substring(0, strInfo.length() - 2);
                          }

                          
          if (strInfo.startsWith("Cancel-1")) {
                              myTask1.cancel();
          //退出單個任務
                              
          // 其實應該在這里判斷myTask2是否也退出了,是的話就應該break.但是因為無法在包外得到
                              
          // myTask2的狀態,所以,這里不能做出是否退出循環的判斷.
                          }
           else if (strInfo.startsWith("Cancel-2")) {
                              myTask2.cancel();
                          }
           else if (strInfo.startsWith("Cancel-All")) {
                              timer.cancel();
          //退出Timer
                              break;
                          }
           else {
                              
          // 只對myTask1作出判斷,偷個懶^_^
                              myTask1.setInfo(strInfo);
                          }

                      }
           catch (IOException e) {
                          
          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }

                  }

              }


              
          static class

          怎么在后臺得到用戶操作的當前時間

          1:引如包(java自帶的)

          import java.util.Date;

          import java.text.SimpleDateFormat;

           

          2代碼

          Date nowTime=new Date();

                        SimpleDateFormat m=new SimpleDateFormat("yyyyMMddHH");

                        System.out.println("時間等于=="+nowTime.toLocaleString());

                       

                        String mmmm=m.format(nowTime);

                        System.out.println("====="+mmmm);

          posted on 2007-04-02 19:33 MEYE 閱讀(707) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 馆陶县| 兴安盟| 海林市| 什邡市| 买车| 天水市| 邹城市| 华坪县| 正蓝旗| 阳新县| 沙田区| 三都| 玉门市| 耿马| 深泽县| 基隆市| 红河县| 灵丘县| 焉耆| 鸡东县| 昭苏县| 县级市| 宁海县| 牙克石市| 宁化县| 武强县| 潞西市| 勃利县| 昭觉县| 梨树县| 大关县| 武安市| 盱眙县| 苗栗县| 松原市| 花垣县| 镇康县| 堆龙德庆县| 苏尼特左旗| 阜新市| 铜山县|