




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第8單元日期和時間Java程序設(shè)計基礎(chǔ)教程((慕課版)(第2版))目錄導(dǎo)航8.1
Date類8.3項目實戰(zhàn)8.2
Calendar類8.4單元小結(jié)8.1.1計算機的時間1970年1月1日是UNIX(UniplexedInformationandComputingService,分時復(fù)用信息計算服務(wù))和C語言的生日。美國計算機科學(xué)家肯尼斯·藍(lán)·湯普遜使用B語言在PDP(ProgrammedDataProcessor,程序數(shù)據(jù)處理機)-7機器上開發(fā)出了UNIX的一個新版本,隨后又與同事丹尼斯·里奇改進了B語言,開發(fā)出了C語言并重寫了UNIX。當(dāng)時,計算機系統(tǒng)是32位系統(tǒng)。時間若使用32位有符號數(shù)表示,可以表示68年;若用32位無符號數(shù)表示,可以表示136年。當(dāng)時人們認(rèn)為可以以1970年1月1日0時0分0秒為時間原點,并在C語言的time()方法中這么應(yīng)用了。因此,計算機便使用1970年1月1日0時0分0秒作為時間原點,隨后的語言也沿用了這種設(shè)定。任務(wù)8-1當(dāng)前時間與計算機時間原點文件ComputerTimeDemo.javapublicclassComputerTimeDemo{publicstaticvoidmain(String[]args)throwsParseException{Dateday=newDate(0);//獲取時間原點longtime=System.currentTimeMillis();//獲取當(dāng)前時間相較于時間原點的毫秒數(shù)Datedate=newDate(time);//獲取Date類型的對象,時間默認(rèn)為當(dāng)前時間//Date類型的toLocaleString()方法已經(jīng)被廢棄,不建議使用,但為了演示方便,暫且使用System.out.println("當(dāng)前時間:"+date.toLocaleString());System.out.println("計算機時間原點:"+day.toLocaleString());longbetween=date.getTime()-day.getTime();System.out.println("系統(tǒng)當(dāng)前時間與計算機時間原點的毫秒值;"+between);System.out.println("當(dāng)前時間與時間原點的差值與系統(tǒng)獲取的當(dāng)前毫秒值的差值:"+(time-between));}}運行結(jié)果如圖8-1所示。從運行結(jié)果不難發(fā)現(xiàn),Java中的時間原點是1970年1月1日8時0分0秒(細(xì)心的讀者可能會問為何不是0點,這是因為北京在東八區(qū),所以使用北京時間時默認(rèn)是8點)。Java中獲取系統(tǒng)當(dāng)前時間毫秒值的方法是Native()方法,該方法是用C語言實現(xiàn)的。8.1.2Date類的應(yīng)用Date類的無參構(gòu)造方法通過獲取當(dāng)前系統(tǒng)的毫秒值來初始化一個日期對象,同時Date類也提供了一個接受毫秒值的構(gòu)造函數(shù)。無參構(gòu)造方法就是將系統(tǒng)當(dāng)前毫秒值傳入該構(gòu)造函數(shù),所以在任務(wù)8-1中最后的毫秒差值是0。另外,當(dāng)傳入一個0作為參數(shù)的時候,返回的是計算機時間原點。SimpleDateFormat類是用于時間格式化的工具類,它可將日期格式化為字符串,同時也支持將字符串轉(zhuǎn)換為日期對象的方法。任務(wù)8-2Date類的使用文件DateDemo.javapublicclassDateDemo{publicstaticvoidmain(String[]args){Datedate=newDate();//獲取計算機的當(dāng)前時間SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");//參數(shù)是日期的格式StringdateStr=sdf.format(date); //將時間格式化System.out.println("格式化輸出時間:"+dateStr);StringdayStr="1990-01-0100:00:00"; //格式化后的日期類型的字符串try{Dateday=sdf.parse(dayStr); //將字符串轉(zhuǎn)換成日期類型System.out.println("使用格式化的日期字符串創(chuàng)建的日期對象;"+day);}catch(ParseExceptione){e.printStackTrace();}}}運行結(jié)果如圖8-2所示。Date類定義了一些簡單的初始化構(gòu)造方法,SimpleDateFormat類中定義了一些簡單的格式化方法,但是日期的使用不僅限于初始化和格式化。目錄導(dǎo)航8.1
Date類8.3項目實戰(zhàn)8.2
Calendar類8.4單元小結(jié)8.2.1Calendar類簡介Calendar類用于進行日期的計算操作,其本身可以由Date類來設(shè)置需要進行計算的時間原點,同時能快速地轉(zhuǎn)換成Date類的對象并輸出。因為編程語言中大多以0為初始值,所以Calendar類中的1月對應(yīng)的數(shù)字實際上是0。由于西方國家認(rèn)為星期日是一個星期的開始,所以,SUNDAY對應(yīng)的數(shù)字是1,而MONDAY對應(yīng)的數(shù)字是2,其他以此類推。8.2.2Calendar類的計算Calendar類能夠快速進行時間的計算,如基于當(dāng)前日期計算某天之前或者之后的日期,或者計算某個月的第幾個星期幾的日期。文件CalendarDemo.javapublicclassCalendarDemo{publicstaticvoidmain(String[]args){Datedate=newDate();//當(dāng)前時間對象SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");System.out.println("當(dāng)前時間是:"+sdf.format(date));//初始化一個日歷對象Calendarcale=Calendar.getInstance();System.out.println("當(dāng)前日歷類型是:"+cale.getCalendarType());//將星期一設(shè)置為每個星期的第一天System.out.println("每個星期的第一天是:"+cale.getFirstDayOfWeek());cale.setFirstDayOfWeek(2);System.out.println("每個星期的第二天是:"+cale.getFirstDayOfWeek());cale.setTime(date);//將當(dāng)前時間設(shè)置為日歷類的初始計算時間任務(wù)8-3日期的計算8.2.2Calendar類的計算//當(dāng)前時間5天前的時間(在當(dāng)前域中加上傳入的值,正數(shù)表示之前,負(fù)數(shù)表示之后)cale.add(Calendar.DAY_OF_YEAR,-5);Dateday=cale.getTime();System.out.println("5天前的時間是:"+sdf.format(day));//獲取每個域的值System.out.println("當(dāng)前年份是:"+cale.get(Calendar.YEAR));System.out.println("當(dāng)前月份是:"+cale.get(Calendar.MONTH));System.out.println("當(dāng)前日是:"+cale.get(Calendar.DATE));//獲取各個域的最大值System.out.println("本月份的最大天數(shù):"+cale.getActualMaximum(Calendar.DATE));System.out.println("本年份的最大天數(shù):"+cale.getActualMaximum(Calendar.DAY_OF_YEAR));//將當(dāng)前月份設(shè)置為2月(月份從0開始)cale.set(Calendar.MONTH,1);System.out.println("當(dāng)前日期是:"+sdf.format(cale.getTime()));System.out.println("本月份的最大天數(shù):"+cale.getActualMaximum(Calendar.DATE));System.out.println("今年有多少周:"+cale.getWeeksInWeekYear());System.out.println("是否支持周日期:"+(cale.isWeekDateSupported()?"是":"否"));}}8.2.2Calendar類的計算運行結(jié)果如圖8-3所示。在Calendar類中,add()方法用于在指定的域(年、月、日)中增加日期。這個日期可以是負(fù)數(shù),負(fù)數(shù)表示該日期之前,正數(shù)表示該日期之后。set()方法用于設(shè)置指定域的值,get()方法用于獲取指定域的值,getActualMaximum()方法用于獲取當(dāng)前時間對應(yīng)的域的最大值,與方法getActualMinimum()的作用相反。GregorianCalendar類是一個公歷的實現(xiàn)類,派生自Calendar類。Calendar類的getInstance()方法返回的實際上就是GregorianCalendar類的對象。該類比Calendar類多了兩個屬性:AD和BC,它們分別表示公元后和公元前。它還有一個很有用的方法——isLeapYear()方法,該方法用于判斷傳入的年份是否為閏年。8.2.2Calendar類的計算文件MonthlyCalendarDemo.javapublicclassMonthlyCalendarDemo{//每個星期的星期幾staticfinalString[]weekDays={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};publicstaticvoidmain(String[]args){Scannerscan=newScanner(System.in);//獲取從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù)的Scanner對象intcounter=0;System.out.println("請輸入年份:");intyear=scan.nextInt();System.out.println("請輸入月份:");intmonth=scan.nextInt()-1;//獲取月份//以指定的年份、月份和該月的第一天作為參數(shù)創(chuàng)建對象GregorianCalendargCale=newGregorianCalendar(year,month,1);//獲取當(dāng)前月份的總天數(shù)inttotalDay=gCale.getActualMaximum(Calendar.DAY_OF_MONTH);intstartWeekDay=gCale.get(Calendar.DAY_OF_WEEK)-1;for(StringweekDay:weekDays){System.out.print(weekDay+"");//3個空格}任務(wù)8-4日歷8.2.2Calendar類的計算System.out.println();//換行for(counter=0;counter<startWeekDay;counter++){System.out.print("");//7個空格}for(intday=1;day<=totalDay;day++){System.out.printf("%2d",day);counter++;if(counter%7==0){System.out.println();//換行}}}}運行結(jié)果如圖8-4所示。目錄導(dǎo)航8.1
Date類8.3項目實戰(zhàn)8.2
Calendar類8.4單元小結(jié)項目8-1記錄文件分割耗時在第7單元項目實戰(zhàn)中的InputSplit類的基礎(chǔ)上,我們可以獲取當(dāng)前時間相較于時間原點的毫秒數(shù),并通過差值計算分割輸入文件耗費的時間,具體如下。文件InputSplit.javapublicList<String>split(longblockSize){longstartTime=System.currentTimeMillis();//在起始位置獲取當(dāng)前時間相較于時間原點的毫秒數(shù)List<String>files=newArrayList<>();intseq=0;try(BufferedReaderbr=Files.newBufferedReader(Paths.get(inputFile),StandardCharsets.UTF_8)){longsize=0L;Stringline;PathfilePath=getFilePath(seq);BufferedWriterbw=Files.newBufferedWriter(filePath,StandardCharsets.UTF_8);files.add(filePath.toString());bw.write(String.valueOf(seq));bw.newLine();while((line=br.readLine())!=null){bw.write(line);項目8-1記錄文件分割耗時bw.newLine();size+=line.getBytes(StandardCharsets.UTF_8).length;if(size>=blockSize){bw.close();++seq;filePath=getFilePath(seq);bw=Files.newBufferedWriter(filePath,StandardCharsets.UTF_8);bw.write(String.valueOf(seq));bw.newLine();files.add(filePath.toString());size=0L;}}}catch(Exceptione){e.printStackTrace();}//再次獲取當(dāng)前時間,通過差值輸出分割文件耗費的總時間System.out.println(String.format("splitinputfilecosttime:[%d]ms",System.currentTimeMillis()-startTime));returnfiles;}項目8-2超市產(chǎn)品過期提醒及促銷活動本項目編寫一個產(chǎn)品過期提醒的程序,能夠自動根據(jù)促銷要求在適當(dāng)?shù)臅r候舉行促銷活動,并在產(chǎn)品過期前10天提醒產(chǎn)品即將過期。產(chǎn)品的過期時間由產(chǎn)品的生產(chǎn)日期及保質(zhì)期來確定。程序需要正確地計算產(chǎn)品的到期日期,并且根據(jù)到期日期來舉行促銷活動和進行過期提醒。
實現(xiàn)代碼如下所示。文件MaturePromotionDemo.javapublicclassMaturePromotionDemo{publicstaticvoidmain(String[]args)throwsParseException{Scannerscan=newScanner(System.in);System.out.println("請輸入當(dāng)前日期,格式為yyyy-MM-dd:");Stringcurrent=scan.nextLine();//假設(shè)產(chǎn)品的到期日期是2018年3月1號StringmatureDate="2018-03-01";//設(shè)定日期的格式是yyyy-MM-dd,與matureDate的格式一樣SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");Dateday=sdf.parse(current);//獲取當(dāng)前日期,判斷是否需要舉行促銷活動或進行過期提醒CalendarcaleMature=Calendar.getInstance();caleMature.setTime(sdf.parse(matureDate));//獲取到期日期的日歷類型//復(fù)制一份副本CalendarcaleNearMature=(Calendar)caleMature.clone();CalendarcaleCurr=Calendar.getInstance();項目8-2超市產(chǎn)品過期提醒及促銷活動caleCurr.setTime(day);//獲取當(dāng)前日期的日歷類型//將日期設(shè)置為到期日期的前10天caleNearMature.add(Calendar.DAY_OF_MONTH,-10);System.out.println("到期日期是:"+caleMature.getTime());System.out.println("提醒日期是:"+caleNearMature.getTime());System.out.println("當(dāng)前日期是:"+caleCurr.getTime());//判斷當(dāng)前日期是否是過期前10天之前if(caleCurr.before(caleNearMature)){//到期日期前10天的第一個星期二開始促銷caleNearMature.add(Calendar.DAY_OF_MONTH,-7);caleNearMature.set(Calendar.DAY_OF_WEEK,Calendar.THURSDAY);System.out.println("促銷開始日期是:"+caleNearMature.getTime());if(caleCurr.befor
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計算機在醫(yī)療領(lǐng)域的應(yīng)用與發(fā)展考核試卷
- 海底油氣管道新型材料研究與開發(fā)進展考核試卷
- 領(lǐng)導(dǎo)科學(xué)中的時間管理試題及答案
- 美團餐飲商家線上流量扶持及轉(zhuǎn)化提升合同
- 虛擬貨幣交易平臺交易風(fēng)險評估補充協(xié)議
- 淘寶電商平臺客服外包隱私保護合同
- 離職員工保密協(xié)議及行業(yè)競爭限制合同(酒店管理行業(yè))
- 虛擬偶像IP與音樂產(chǎn)業(yè)合作運營協(xié)議
- 電子商務(wù)平臺數(shù)據(jù)備份與隱私保護責(zé)任書
- 智能建筑能源管理系統(tǒng)施工與能源監(jiān)測與控制合同
- 上海卷78-83題 閱讀回答問題D篇-2023年中考英語臨考復(fù)習(xí)題(上海卷)(解析版)
- 讀書分享(《給教師的建議》)課件
- 股票的知識講座
- 工廠管理工作流程
- 服裝企業(yè)銷售經(jīng)理的主要工作職責(zé)描述范本
- 人工智能在招聘中的應(yīng)用
- 日結(jié)人員勞務(wù)合作協(xié)議 標(biāo)準(zhǔn)版
- (完整版)病例演講比賽PPT模板
- 初中生物知識雙向細(xì)目表
- 中國建行存單英文翻譯
- 事業(yè)單位工作人員調(diào)動審批表格
評論
0/150
提交評論