posts - 189,comments - 115,trackbacks - 0

          軟件,讓世界變平


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


          500年前哥倫布發(fā)現(xiàn)美洲大陸,證明地球是圓的;21世紀(jì)初美國《紐約時(shí)報(bào)》專欄作家弗里德曼來到亞洲后感慨:世界是平的!

          無獨(dú)有偶,經(jīng)過重重篩選和征集,2008北京奧運(yùn)終于選出了這樣的口號:同一個(gè)世界,同一個(gè)夢想。

          因?yàn)槭澜鐝臎]有像現(xiàn)在這么小過,也從來沒有像現(xiàn)在這么近過。

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

          全球化的利器就是網(wǎng)絡(luò)和軟件。

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

          時(shí)間是“平”的

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

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

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

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

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



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



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

          作為一個(gè)手工作坊發(fā)展起來的企業(yè),雪豹集團(tuán)的管理是傳統(tǒng)的粗放管理。手工作業(yè),無法實(shí)時(shí)了解訂單、回款狀況,而且業(yè)務(wù)繁多,時(shí)常會(huì)訂單、發(fā)貨出錯(cuò)。這導(dǎo)致雪豹每年都要造成三四百萬元的損失。

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

          一年之后,雪豹的信息化系統(tǒng)已經(jīng)全面覆蓋了企業(yè)的各個(gè)管理領(lǐng)域。雪豹有很多訂單是出口的,現(xiàn)在他們也能實(shí)時(shí)了解最新的訂單情況,國內(nèi)國外,雖然差著萬里,但卻沒有差別。

          世界500強(qiáng)的國外企業(yè),花了近百年的時(shí)間邁入信息時(shí)代,而江蘇一個(gè)小小的民營罐頭廠,一年之內(nèi)也進(jìn)入了信息時(shí)代的門檻。

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

          空間是“平”的

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

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

          即時(shí)通訊軟件的優(yōu)點(diǎn)是毋庸置疑的,只要通信雙方擁有同樣的軟件,只需打開小小的窗口就能與對方進(jìn)行通信。不管對方是在世界的哪一端。不知不覺間,即時(shí)通訊軟件成了人們在網(wǎng)上聯(lián)絡(luò)的大紅大紫的寵兒,幾乎每個(gè)網(wǎng)上用戶都有了自己的即時(shí)通訊賬號,甚至,即時(shí)通訊的賬號成為了網(wǎng)絡(luò)上每個(gè)用戶的必備ID。

          坐地日行八萬里,巡天遙看一千河,從神話中成為了現(xiàn)實(shí)。

          1999年,騰訊公司創(chuàng)始人馬化騰將中國的第一個(gè)即時(shí)通訊工具Oicq推向了互聯(lián)網(wǎng)舞臺(tái)。六年間,騰訊小企鵝的飛速發(fā)展成為互聯(lián)網(wǎng)應(yīng)用中最引人注目的現(xiàn)象之一。今天,每個(gè)上網(wǎng)的人幾乎必備騰訊QQ、雅虎通、MSN等即時(shí)通訊軟件。隨著騰訊QQ在中國的巨大成功,互聯(lián)網(wǎng)的本質(zhì)得到人們更多認(rèn)識(shí),一個(gè)巨大的以即時(shí)通訊為核心的互聯(lián)網(wǎng)應(yīng)用產(chǎn)業(yè)也在逐漸形成之中。

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

          精神是“平”的

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

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

          這種“平”,首先是一種改變國家軟件產(chǎn)業(yè)的平等。
          面對軟件游戲規(guī)則被國外掌握的困境,只要敢想,就可以找到平等對話的機(jī)會(huì)。

          長期以來,中國軟件在與國外軟件的競爭中往往處于被動(dòng),缺乏戰(zhàn)略上的競爭優(yōu)勢。無論從國家安全還是產(chǎn)業(yè)角度,中國都需要一場場在軟件領(lǐng)域的勝利突圍。這不僅是必要的,而且是必須的。

          面向構(gòu)件就是其中一種選擇。面向構(gòu)件是軟件美國在痛定思痛之后不得不作出的選擇。而中國在此方面有著無以倫比的優(yōu)勢。因?yàn)槲覀儫o需推倒重來,我們沒有那么多的廢墟和負(fù)擔(dān),我們有的,只是建造一個(gè)美麗新世界的勇氣和果敢。

          面向構(gòu)件的模式,可以讓中國在技術(shù)上幾乎處在最領(lǐng)先的起跑線上。本土的軟件企業(yè)理當(dāng)有實(shí)力解開困擾很多中國企業(yè)的軟件死結(jié),同時(shí)在解開中國企業(yè)級軟件死結(jié)的背后所展現(xiàn)的一個(gè)重大機(jī)會(huì)似乎更讓人激動(dòng):面向構(gòu)件的應(yīng)用基礎(chǔ)平臺(tái)完全可以在這個(gè)領(lǐng)域形成本土的企業(yè)群,并成就中國的軟件產(chǎn)業(yè)的國際大企業(yè)夢想。

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

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

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

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

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

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

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

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

          弗里德曼說,小時(shí)候爸媽說:“兒子啊,乖乖把飯吃完,因?yàn)橹袊《鹊男『]飯吃。”現(xiàn)在他自己則說:“女兒啊,乖乖把書念完,因?yàn)橹袊《鹊男『⒄戎鴵屇愕娘埻搿?#8221;

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

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

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



          Java的時(shí)間處理(續(xù)<計(jì)算Java時(shí)間>)

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



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

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

          第二個(gè)創(chuàng)建一個(gè)表示一個(gè)日期,小時(shí),分鐘和秒:

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

          首先,我應(yīng)該提醒一下,每一個(gè)構(gòu)造函數(shù)需要時(shí)間信息中的日期信息(年,月,日)。如果你想說2:30 p.m.,你必須指出日期。
          同樣,每一個(gè)GregorianCalendar構(gòu)造函數(shù)創(chuàng)建一個(gè)在時(shí)間上使用毫秒計(jì)算的對象。所以,如果你的構(gòu)造函數(shù)只提供年,月,日參數(shù),那小時(shí),分鐘,秒和毫秒的值將被置0.
          DateFormat和時(shí)間
          你可以使用靜態(tài)方法getDateTimeInstance(int dateStyle,int timeStyle)來建立DateFormat對象來顯示時(shí)間和日期。這個(gè)方法表明你想要的日期和時(shí)間格式。如果你喜歡使用缺省格式,可以使用getDateTimeInstance()來代替它。
          你可以使用靜態(tài)方法getTimeInstance(int timeStyle)創(chuàng)建DateFormat對象來顯示正確的時(shí)間。
          下面的程序示范了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
          (輸出根據(jù)你所在得地區(qū)有所不同)

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

          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

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

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

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

          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);
          }
          }

          輸出結(jié)果如下:

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

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

          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)

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

          * 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.

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

          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;
          }
          }

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

          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);
          }
          }

          當(dāng)計(jì)算時(shí),上面的程序可能有用,例如,最近的航班。它顯示下面的輸出:

          Days = 33
          Months = 2

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

          關(guān)于作者
          Robert Nielsen是SCJP。他擁有碩士學(xué)位,專攻計(jì)算機(jī)教育,并且在計(jì)算機(jī)領(lǐng)域執(zhí)教多年。他也在各樣的雜志上發(fā)表過很多計(jì)算機(jī)相關(guān)的文章。
          關(guān)于譯者
          Cocia Lin(cocia@163.com)是程序員。它擁有學(xué)士學(xué)位,現(xiàn)在專攻Java相關(guān)技術(shù),剛剛開始在計(jì)算機(jī)領(lǐng)域折騰。



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

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

               Timer類是用來執(zhí)行任務(wù)的類,它接受一個(gè)TimerTask做參數(shù)

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



          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秒后執(zhí)行此任務(wù),每次間隔2秒,如果傳遞一個(gè)Data參數(shù),就可以在某個(gè)固定的時(shí)間執(zhí)行這個(gè)任務(wù).
                  
          while(true){//這個(gè)是用來停止此任務(wù)的,否則就一直循環(huán)執(zhí)行此任務(wù)了
                      
          try {
                          
          int ch = System.in.read();
                          
          if(ch-'c'==0){
                              timer.cancel();//使用這個(gè)方法退出任務(wù)
                              
                          }

                      }
           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+,還有一個(gè)scheduleAtFixedRate模式可以用,在這個(gè)模式下,Timer會(huì)盡量的讓任務(wù)在一個(gè)固定的頻率下運(yùn)行,舉例說明:在上面的例子中,我們想讓MyTask在1秒鐘后,每兩秒鐘執(zhí)行一次,但是因?yàn)閖ava不是實(shí)時(shí)的(其實(shí)java實(shí)時(shí)性很差.....),所以,我們在上個(gè)程序中表達(dá)的原義并不能夠嚴(yán)格執(zhí)行.如果我們調(diào)用的是scheduleAtFixedRate,那么,Timer會(huì)盡量讓你的Task執(zhí)行的頻率保持在2秒一次.運(yùn)行上面的程序,假設(shè)使用的是scheduleAtFixedRate,那么下面的場景就是可能的:1秒鐘后,MyTask 執(zhí)行一次,因?yàn)橄到y(tǒng)繁忙,之后的2.5秒后MyTask 才得以執(zhí)行第二次,然后,Timer記下了這個(gè)延遲,并嘗試在下一個(gè)任務(wù)的時(shí)候彌補(bǔ)這個(gè)延遲,那么,1.5秒后,MyTask 將執(zhí)行的三次."以固定的頻率而不是固定的延遲時(shí)間去執(zhí)行一個(gè)任務(wù)"

          果然很方便吧^_^

           

           

          下面給出一個(gè)復(fù)雜點(diǎn)的例子,其中告訴大家怎么退出單個(gè)TimerTask,怎么退出所有Task

          package MyTimerTest;

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


          /*
           * 本類給出了使用Timer和TimerTaske的主要方法,其中包括定制任務(wù),添加任務(wù)
           * 退出任務(wù),退出定時(shí)器.
           * 因?yàn)門imerTask的status域是包級可訪問的,所以沒有辦法在java.util.包外
           * 得到其狀態(tài),這對編程造成一些不便 .我們不能判斷某個(gè)Task的狀態(tài)了.
           * 
           
          */


          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");//從控制臺(tái)讀出信息
                          if (strInfo.charAt(strInfo.length() - 1== ' '{
                              strInfo 
          = strInfo.substring(0, strInfo.length() - 2);
                          }

                          
          if (strInfo.startsWith("Cancel-1")) {
                              myTask1.cancel();
          //退出單個(gè)任務(wù)
                              
          // 其實(shí)應(yīng)該在這里判斷myTask2是否也退出了,是的話就應(yīng)該break.但是因?yàn)闊o法在包外得到
                              
          // myTask2的狀態(tài),所以,這里不能做出是否退出循環(huán)的判斷.
                          }
           else if (strInfo.startsWith("Cancel-2")) {
                              myTask2.cancel();
                          }
           else if (strInfo.startsWith("Cancel-All")) {
                              timer.cancel();
          //退出Timer
                              break;
                          }
           else {
                              
          // 只對myTask1作出判斷,偷個(gè)懶^_^
                              myTask1.setInfo(strInfo);
                          }

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

                  }

              }


              
          static class

          怎么在后臺(tái)得到用戶操作的當(dāng)前時(shí)間

          1:引如包(java自帶的)

          import java.util.Date;

          import java.text.SimpleDateFormat;

           

          2代碼

          Date nowTime=new Date();

                        SimpleDateFormat m=new SimpleDateFormat("yyyyMMddHH時(shí)");

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

                       

                        String mmmm=m.format(nowTime);

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 黄浦区| 昌乐县| 日土县| 曲周县| 北票市| 都安| 固安县| 白河县| 三江| 加查县| 远安县| 芜湖县| 科技| 宁强县| 万源市| 宁化县| 莎车县| 临沂市| 斗六市| 西充县| 江津市| 定兴县| 郯城县| 石渠县| 正安县| 呼和浩特市| 天祝| 鄂伦春自治旗| 徐闻县| 九龙坡区| 香格里拉县| 广灵县| 平泉县| 武陟县| 将乐县| 苗栗市| 澎湖县| 兴宁市| 深州市| 湖北省| 滁州市|