posts - 189,comments - 115,trackbacks - 0

          軟件,讓世界變平


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


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

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

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

          幾千年前,老子的夢(mèng)想——小國(guó)寡民,雞犬之聲相聞,老死不相往來(lái),轟然倒塌。

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

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

          時(shí)間是“平”的

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

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

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

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

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



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



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

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

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

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

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

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

          空間是“平”的

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

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

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

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

          1999年,騰訊公司創(chuàng)始人馬化騰將中國(guó)的第一個(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在中國(guó)的巨大成功,互聯(lián)網(wǎng)的本質(zhì)得到人們更多認(rèn)識(shí),一個(gè)巨大的以即時(shí)通訊為核心的互聯(lián)網(wǎng)應(yīng)用產(chǎn)業(yè)也在逐漸形成之中。

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

          精神是“平”的

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          弗里德曼說(shuō),小時(shí)候爸媽說(shuō):“兒子啊,乖乖把飯吃完,因?yàn)橹袊?guó)跟印度的小孩沒(méi)飯吃。”現(xiàn)在他自己則說(shuō):“女兒啊,乖乖把書(shū)念完,因?yàn)橹袊?guó)跟印度的小孩正等著搶你的飯碗。”

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

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

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



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

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



          這篇文章是在我發(fā)表過(guò)的<計(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日開(kāi)始的毫秒數(shù).
          2. Date類的構(gòu)造函數(shù)Date()返回代表當(dāng)前創(chuàng)建的時(shí)刻的對(duì)象。Date的方法getTime()返回一個(gè)long值在數(shù)值上等于1970年1月1日之前或之后的時(shí)刻。
          3. DateFormat類用來(lái)轉(zhuǎn)換Date到String,反之亦然。靜態(tài)方法getDateInstance()返回DateFormat的缺省格式;getDateInstance(DateFormat.FIELD)返回指定的DateFormat對(duì)象格式。Format(Date d)方法返回String表示日期,例如"January 1,2002."反過(guò)來(lái),parse(String s)方法返回以參數(shù)字符串表示的Date對(duì)象。
          4. format()方法返回的字符串格式根據(jù)不同地區(qū)的時(shí)間設(shè)置而有所不同。
          5. GregorianCalendear類有兩個(gè)重要的構(gòu)造函數(shù):GregorianCalerdar(),返回代表當(dāng)前創(chuàng)建時(shí)間的對(duì)象;GregorianCalendar(int year,int month,int date)返回代表任意日期的對(duì)象。GregorianCalendar類的getTime()方法返回日期對(duì)象。Add(int field,int amount)方法通過(guò)加或減時(shí)間單位,象天數(shù),月數(shù)或年數(shù)來(lái)計(jì)算日期。
          GregorianCalendar和 時(shí)間
          兩個(gè)GregorianCalendar的構(gòu)造函數(shù)可以用來(lái)處理時(shí)間。前者創(chuàng)建一個(gè)表示日期,小時(shí)和分鐘的對(duì)象:

          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í)間信息中的日期信息(年,月,日)。如果你想說(shuō)2:30 p.m.,你必須指出日期。
          同樣,每一個(gè)GregorianCalendar構(gòu)造函數(shù)創(chuàng)建一個(gè)在時(shí)間上使用毫秒計(jì)算的對(duì)象。所以,如果你的構(gòu)造函數(shù)只提供年,月,日參數(shù),那小時(shí),分鐘,秒和毫秒的值將被置0.
          DateFormat和時(shí)間
          你可以使用靜態(tài)方法getDateTimeInstance(int dateStyle,int timeStyle)來(lái)建立DateFormat對(duì)象來(lái)顯示時(shí)間和日期。這個(gè)方法表明你想要的日期和時(shí)間格式。如果你喜歡使用缺省格式,可以使用getDateTimeInstance()來(lái)代替它。
          你可以使用靜態(tài)方法getTimeInstance(int timeStyle)創(chuàng)建DateFormat對(duì)象來(lái)顯示正確的時(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ì)算過(guò)去的時(shí)間;例如,給你開(kāi)始和結(jié)束時(shí)間,你想知道制造流程的持續(xù)時(shí)間。一個(gè)出租公司按小時(shí)或天數(shù)出租東西,計(jì)算時(shí)間對(duì)他們也很有用。同樣的,在金融界,經(jīng)常需要計(jì)算重要的支付時(shí)間。
          將問(wèn)題復(fù)雜化,人類至少是用兩種方法計(jì)算時(shí)間。你可以說(shuō)一天已經(jīng)結(jié)束當(dāng)24小時(shí)過(guò)去了,或者日歷從今天翻到明天。我們將討論我們想到的這兩種情況。
          時(shí)間段,情況 1:嚴(yán)格時(shí)間單位
          在這種情況中,只有24小時(shí)過(guò)去,這天才過(guò)去,60分鐘過(guò)去,這個(gè)小時(shí)才過(guò)去,60秒過(guò)去,這個(gè)分鐘才過(guò)去,以此類推。在這個(gè)方法中,23小時(shí)的時(shí)間將被認(rèn)為是0天。
          使用這種方法計(jì)算時(shí)間段,你從計(jì)算過(guò)去的毫秒開(kāi)始。為了做到這一點(diǎn),首先轉(zhuǎn)換每個(gè)日期為從1970年1月1日起得毫秒數(shù)。你可以從第二個(gè)毫秒值中減去第一個(gè)毫秒值。這里有一個(gè)簡(jiǎn)單的計(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è)程序也帶來(lái)一點(diǎn)混淆。GregorianCalendar類的getTime()返回一個(gè)Date對(duì)象,Date類的getTime()方法返回從1970年1月1日到這個(gè)時(shí)間的long類型的毫秒數(shù)值。雖然他們的方法名字相同,返回值卻不一樣!
          下面的程序片斷用簡(jiǎn)單的整數(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ù)值,可以使用下面的過(guò)程:
          1. 計(jì)算最大的單位,減去這個(gè)數(shù)值的秒數(shù)
          2. 計(jì)算第二大單位,減去這個(gè)數(shù)值的秒數(shù)
          3. 重復(fù)操作直到只剩下秒
          例如,如果你的時(shí)間的10,000秒,你想知道這個(gè)數(shù)值相應(yīng)的是多少小時(shí),多少分鐘,多少秒,你從最大的單位開(kāi)始:小時(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í),問(wèn)題就產(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ù)暮?jiǎn)單:如果你要統(tǒng)計(jì)天數(shù),你可以簡(jiǎn)單的統(tǒng)計(jì)日期變化次數(shù)。例如,如果某事15日開(kāi)始,17日結(jié)束,經(jīng)過(guò)2天。(日期先是便到16,再到17)同樣的,一個(gè)步驟下午3:25開(kāi)始,4:10 p.m結(jié)束,歷時(shí)1個(gè)小時(shí),因?yàn)樾r(shí)數(shù)值變了一次(從3到4)。
          圖書(shū)館經(jīng)常使用這種習(xí)慣計(jì)算時(shí)間。例如,如果你從圖書(shū)館接一本書(shū),我不能占有這本書(shū)最少24小時(shí),會(huì)認(rèn)為圖書(shū)館這樣才給你算一天。而是,我的賬號(hào)上記錄我借書(shū)的日期。日期以變成下一天,我就已經(jīng)結(jié)這本書(shū)一天了,即使總計(jì)不足24小時(shí)。
          當(dāng)使用單位的變化來(lái)計(jì)算時(shí)間段,通常感覺(jué)計(jì)算的時(shí)間沒(méi)有多于一個(gè)時(shí)間單位。例如,如果9:00 p.m.我借了一本圖書(shū)館的書(shū),第二天中午還回去,我能算出我借了這本書(shū)一天了??墒牵幸环N感覺(jué)在問(wèn):"1天和幾個(gè)小時(shí)呢?"這本說(shuō)總計(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ù)就是答案??梢允褂胋efore()和after()方法,他們返回boolean值,來(lái)判斷是否一個(gè)日期在另一個(gè)日期之前或之后。
          下面的類的方法用來(lái)計(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ǔ)充另外的方法來(lái)處理小時(shí)和分鐘。同樣,計(jì)算時(shí)間段的算法能更高效一些,尤其是時(shí)間相隔很長(zhǎng)??墒?,作為介紹目的,這個(gè)算法有短小和簡(jiǎn)單的優(yōu)勢(shì)。
          下面的例子使用ElapsedTime類來(lái)計(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ù)算法很適合像圖書(shū)館借書(shū)這樣的應(yīng)用,你看到了她怎樣工作)
          告誡
          在進(jìn)行時(shí)間工作時(shí)要謹(jǐn)慎:你看到的時(shí)間段的例子,你精確仔細(xì)的考慮非常重要。本文介紹了兩種通常計(jì)算時(shí)間段的想法,但是人們能想到的時(shí)間段的計(jì)算方法僅僅受到人類想象力的限制。
          所以,當(dāng)寫一個(gè)Java程序的時(shí)候,確信你的精確度能讓使用和以來(lái)這些程序的人滿意。同樣,徹底的測(cè)試程序?qū)μ幚頃r(shí)間的程序非重重要。
          總結(jié)
          本文是在我的前一篇文章 Java時(shí)間計(jì)算介紹怎樣使用GregorianCalendar 和 DateFormat類處理時(shí)間問(wèn)題的基礎(chǔ)上的。你已經(jīng)看到了兩種方法來(lái)思考時(shí)間段問(wèn)題和兩種相應(yīng)的途徑使用Java來(lái)處理時(shí)間問(wèn)題。這里提供的信息,很基礎(chǔ),提供給你一個(gè)在Java中處理時(shí)間問(wèn)題的有力工具。

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



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

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

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

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



          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è)是用來(lái)停止此任務(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)行,舉例說(shuō)明:在上面的例子中,我們想讓MyTask在1秒鐘后,每?jī)擅腌妶?zhí)行一次,但是因?yàn)閖ava不是實(shí)時(shí)的(其實(shí)java實(shí)時(shí)性很差.....),所以,我們?cè)谏蟼€(gè)程序中表達(dá)的原義并不能夠嚴(yán)格執(zhí)行.如果我們調(diào)用的是scheduleAtFixedRate,那么,Timer會(huì)盡量讓你的Task執(zhí)行的頻率保持在2秒一次.運(yùn)行上面的程序,假設(shè)使用的是scheduleAtFixedRate,那么下面的場(chǎng)景就是可能的: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域是包級(jí)可訪問(wèn)的,所以沒(méi)有辦法在java.util.包外
           * 得到其狀態(tài),這對(duì)編程造成一些不便 .我們不能判斷某個(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(wú)法在包外得到
                              
          // myTask2的狀態(tài),所以,這里不能做出是否退出循環(huán)的判斷.
                          }
           else if (strInfo.startsWith("Cancel-2")) {
                              myTask2.cancel();
                          }
           else if (strInfo.startsWith("Cancel-All")) {
                              timer.cancel();
          //退出Timer
                              break;
                          }
           else {
                              
          // 只對(duì)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) 評(píng)論(0)  編輯  收藏

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 城口县| 阿拉善右旗| 库伦旗| 旌德县| 旬阳县| 太仆寺旗| 内黄县| 平和县| 百色市| 楚雄市| 堆龙德庆县| 栖霞市| 德州市| 莱阳市| 尤溪县| 修水县| 大同市| 民和| 德格县| 海宁市| 清水河县| 南宁市| 鹤壁市| 巫山县| 古交市| 南漳县| 澳门| 二连浩特市| 四会市| 右玉县| 双辽市| 方城县| 徐闻县| 岳阳县| 米脂县| 揭西县| 仙桃市| 永吉县| 盐城市| 兰溪市| 十堰市|