測(cè)試類
/** * @Description TestDateUtil.java * @author 張軍 * @date 2021年10月19日 下午11:18:23 * @version V1.0 */ package test.share; import java.util.Date; import org.junit.Test; import test.all.TestUtil; import zj.date.util.DateUtil; import zj.java.util.JavaUtil; /** * @author 張軍 * @date 2021年10月19日 下午11:18:23 * @version V1.0 */ public class TestDateUtil { @Test public void 基本工具類() { System.out.println("日期轉(zhuǎn)字符串"); System.out.println(DateUtil.dateParse(new Date(), "yyyy年MM月dd日HH時(shí)mm分ss秒SSS毫秒p(0-6=>周日-周六)w x q季度")); System.out.println("字符串轉(zhuǎn)日期"); System.out.println(DateUtil.parseDate("2019-07-30")); System.out.println(DateUtil.parseDate("2019-07-30 10:11:12")); System.out.println(DateUtil.parseDate("20190730")); System.out.println(DateUtil.parseDate("20190730101112")); System.out.println(DateUtil.parseDate("2019/07/30 10:11:12")); System.out.println(DateUtil.parseDate("2019-07-30 10:11")); System.out.println(DateUtil.parseDate("2019/07/30 10:11")); System.out.println(DateUtil.parseDate("2019/07/30 10")); System.out.println(DateUtil.parseDate("2019-07-30 10")); System.out.println("日期相差天數(shù)"); System.out.println("2019-02-25到2019-03-10共" + DateUtil.diffDay(DateUtil.parseDate("2019-02-25"), DateUtil.parseDate("2019-03-10")) + "天"); System.out.println("2019-02-25加10天是" + DateUtil.dateParse(DateUtil.addDay(DateUtil.parseDate("2019-02-25"), 10), "yyyy-MM-dd")); System.out.println("對(duì)日期或時(shí)間相加減就不多做測(cè)試了"); System.out.println(DateUtil.dateParse(new Date(), "yyy-MM-ddw")); System.out.println(DateUtil.getDescWeekday(DateUtil.dateParse(new Date(), "w"))); System.out.println(DateUtil.dateParse(DateUtil.parseDate("20200820080301"), "HH24點(diǎn)m分ss秒")); } @Test public void 時(shí)間相差() { String sd = "1234年56月78日 星期三"; sd = "01月03日 星期日 03:20"; String t = "91:23"; // String s = sd + t; String V_sdateNum = JavaUtil.conversionStringToNumber(sd) + "00"; if (V_sdateNum.length() == 10) { V_sdateNum = DateUtil.dateParse(new Date(), "yyyy") + V_sdateNum; } System.out.println(JavaUtil.split(sd.replace("年", "").replace("月", "").replace("日", ""), " ")[0]); System.out.println(t.replace(":", "") + "00"); System.out.println(V_sdateNum); System.out.println(DateUtil.dateParse(DateUtil.parseDate(V_sdateNum))); Date d = new Date(); d.setTime(1625713200000l); System.out.println(DateUtil.dateParse(d)); System.out.println(DateUtil.dateParse(DateUtil.addMonth(DateUtil.parseDate("2020-01-31"), 1))); } @Test public void 日期范圍() { TestUtil.printStart("查詢?nèi)掌诜秶?quot;); Date startDate = DateUtil.parseDate("2021"); String sstartDate = DateUtil.dateParse(startDate, "yyyy-MM-dd"); String sendDate = DateUtil.dateParse(DateUtil.addYear(startDate, 3), "yyyy-MM-dd"); long diffDays = DateUtil.diffDay(DateUtil.parseDate(sstartDate), DateUtil.parseDate(sendDate)); System.out.println(sstartDate + "到" + sendDate + "共" + diffDays + "天,以下是循環(huán)每一天"); for (int a = 0; a <= diffDays; a++) { Date d = DateUtil.addDay(DateUtil.parseDate(sstartDate), a); // String tdate = DateUtil.dateParse(d, "yyyy年MM月dd日 ") + DateUtil.getDescWeekday(DateUtil.dateParse(d, "w")); String tdate = DateUtil.dateParse(d, "yyyyMMdd"); // String tdate = DateUtil.dateParse(d, "MM月dd日 ") + DateUtil.getDescWeekday(DateUtil.dateParse(d, "w")); // String tdate = DateUtil.dateParse(d, "yyyy"); System.out.println("'" + tdate + "',"); } TestUtil.printEnd("查詢?nèi)掌诜秶?quot;); } }
測(cè)試結(jié)果
日期轉(zhuǎn)字符串 2021年10月19日23時(shí)20分22秒894毫秒下午(0-6=>周日-周六)2 星期二 4季度 字符串轉(zhuǎn)日期 Tue Jul 30 00:00:00 CST 2019 Tue Jul 30 10:11:12 CST 2019 Tue Jul 30 00:00:00 CST 2019 Tue Jul 30 10:11:12 CST 2019 Tue Jul 30 10:11:12 CST 2019 Tue Jul 30 10:11:00 CST 2019 Tue Jul 30 10:11:00 CST 2019 Tue Jul 30 10:00:00 CST 2019 Tue Jul 30 10:00:00 CST 2019 日期相差天數(shù) 2019-02-25到2019-03-10共13天 2019-02-25加10天是2019-03-07 對(duì)日期或時(shí)間相加減就不多做測(cè)試了 21y-10-192 星期二 08點(diǎn)3分01秒 查詢?nèi)掌诜秶?----->測(cè)試開始 2021-01-01到2024-01-01共1095天,以下是循環(huán)每一天 '20210101', '20210102', '20210103', '20210104', '20210105', '20210106', '20210107', '20210108', '20210109', '20210110', '20210111', '20210112', '20210113', '20210114', '20210115', '20210116', '20210117', '20210118', '20210119', '20210120', '20210121', '20210122', '20210123', '20210124', '20210125', '20210126', '20210127', '20210128', '20210129', '20210130', '20210131', '20210201', '20210202', '20210203', '20210204', '20210205', '20210206', '20210207', '20210208', '20210209', '20210210', '20210211', '20210212', '20210213', '20210214', '20210215', '20210216', '20210217', '20210218', '20210219', '20210220', '20210221', '20210222', '20210223', '20210224', '20210225', '20210226', '20210227', '20210228', '20210301', '20210302', '20210303', '20210304', '20210305', '20210306', '20210307', '20210308', '20210309', '20210310', '20210311', '20210312', '20210313', '20210314', '20210315', '20210316', '20210317', '20210318', '20210319', '20210320', '20210321', '20210322', '20210323', '20210324', '20210325', '20210326', '20210327', '20210328', '20210329', '20210330', '20210331', '20210401', '20210402', '20210403', '20210404', '20210405', '20210406', '20210407', '20210408', '20210409', '20210410', '20210411', '20210412', '20210413', '20210414', '20210415', '20210416', '20210417', '20210418', '20210419', '20210420', '20210421', '20210422', '20210423', '20210424', '20210425', '20210426', '20210427', '20210428', '20210429', '20210430', '20210501', '20210502', '20210503', '20210504', '20210505', '20210506', '20210507', '20210508', '20210509', '20210510', '20210511', '20210512', '20210513', '20210514', '20210515', '20210516', '20210517', '20210518', '20210519', '20210520', '20210521', '20210522', '20210523', '20210524', '20210525', '20210526', '20210527', '20210528', '20210529', '20210530', '20210531', '20210601', '20210602', '20210603', '20210604', '20210605', '20210606', '20210607', '20210608', '20210609', '20210610', '20210611', '20210612', '20210613', '20210614', '20210615', '20210616', '20210617', '20210618', '20210619', '20210620', '20210621', '20210622', '20210623', '20210624', '20210625', '20210626', '20210627', '20210628', '20210629', '20210630', '20210701', '20210702', '20210703', '20210704', '20210705', '20210706', '20210707', '20210708', '20210709', '20210710', '20210711', '20210712', '20210713', '20210714', '20210715', '20210716', '20210717', '20210718', '20210719', '20210720', '20210721', '20210722', '20210723', '20210724', '20210725', '20210726', '20210727', '20210728', '20210729', '20210730', '20210731', '20210801', '20210802', '20210803', '20210804', '20210805', '20210806', '20210807', '20210808', '20210809', '20210810', '20210811', '20210812', '20210813', '20210814', '20210815', '20210816', '20210817', '20210818', '20210819', '20210820', '20210821', '20210822', '20210823', '20210824', '20210825', '20210826', '20210827', '20210828', '20210829', '20210830', '20210831', '20210901', '20210902', '20210903', '20210904', '20210905', '20210906', '20210907', '20210908', '20210909', '20210910', '20210911', '20210912', '20210913', '20210914', '20210915', '20210916', '20210917', '20210918', '20210919', '20210920', '20210921', '20210922', '20210923', '20210924', '20210925', '20210926', '20210927', '20210928', '20210929', '20210930', '20211001', '20211002', '20211003', '20211004', '20211005', '20211006', '20211007', '20211008', '20211009', '20211010', '20211011', '20211012', '20211013', '20211014', '20211015', '20211016', '20211017', '20211018', '20211019', '20211020', '20211021', '20211022', '20211023', '20211024', '20211025', '20211026', '20211027', '20211028', '20211029', '20211030', '20211031', '20211101', '20211102', '20211103', '20211104', '20211105', '20211106', '20211107', '20211108', '20211109', '20211110', '20211111', '20211112', '20211113', '20211114', '20211115', '20211116', '20211117', '20211118', '20211119', '20211120', '20211121', '20211122', '20211123', '20211124', '20211125', '20211126', '20211127', '20211128', '20211129', '20211130', '20211201', '20211202', '20211203', '20211204', '20211205', '20211206', '20211207', '20211208', '20211209', '20211210', '20211211', '20211212', '20211213', '20211214', '20211215', '20211216', '20211217', '20211218', '20211219', '20211220', '20211221', '20211222', '20211223', '20211224', '20211225', '20211226', '20211227', '20211228', '20211229', '20211230', '20211231', '20220101', '20220102', '20220103', '20220104', '20220105', '20220106', '20220107', '20220108', '20220109', '20220110', '20220111', '20220112', '20220113', '20220114', '20220115', '20220116', '20220117', '20220118', '20220119', '20220120', '20220121', '20220122', '20220123', '20220124', '20220125', '20220126', '20220127', '20220128', '20220129', '20220130', '20220131', '20220201', '20220202', '20220203', '20220204', '20220205', '20220206', '20220207', '20220208', '20220209', '20220210', '20220211', '20220212', '20220213', '20220214', '20220215', '20220216', '20220217', '20220218', '20220219', '20220220', '20220221', '20220222', '20220223', '20220224', '20220225', '20220226', '20220227', '20220228', '20220301', '20220302', '20220303', '20220304', '20220305', '20220306', '20220307', '20220308', '20220309', '20220310', '20220311', '20220312', '20220313', '20220314', '20220315', '20220316', '20220317', '20220318', '20220319', '20220320', '20220321', '20220322', '20220323', '20220324', '20220325', '20220326', '20220327', '20220328', '20220329', '20220330', '20220331', '20220401', '20220402', '20220403', '20220404', '20220405', '20220406', '20220407', '20220408', '20220409', '20220410', '20220411', '20220412', '20220413', '20220414', '20220415', '20220416', '20220417', '20220418', '20220419', '20220420', '20220421', '20220422', '20220423', '20220424', '20220425', '20220426', '20220427', '20220428', '20220429', '20220430', '20220501', '20220502', '20220503', '20220504', '20220505', '20220506', '20220507', '20220508', '20220509', '20220510', '20220511', '20220512', '20220513', '20220514', '20220515', '20220516', '20220517', '20220518', '20220519', '20220520', '20220521', '20220522', '20220523', '20220524', '20220525', '20220526', '20220527', '20220528', '20220529', '20220530', '20220531', '20220601', '20220602', '20220603', '20220604', '20220605', '20220606', '20220607', '20220608', '20220609', '20220610', '20220611', '20220612', '20220613', '20220614', '20220615', '20220616', '20220617', '20220618', '20220619', '20220620', '20220621', '20220622', '20220623', '20220624', '20220625', '20220626', '20220627', '20220628', '20220629', '20220630', '20220701', '20220702', '20220703', '20220704', '20220705', '20220706', '20220707', '20220708', '20220709', '20220710', '20220711', '20220712', '20220713', '20220714', '20220715', '20220716', '20220717', '20220718', '20220719', '20220720', '20220721', '20220722', '20220723', '20220724', '20220725', '20220726', '20220727', '20220728', '20220729', '20220730', '20220731', '20220801', '20220802', '20220803', '20220804', '20220805', '20220806', '20220807', '20220808', '20220809', '20220810', '20220811', '20220812', '20220813', '20220814', '20220815', '20220816', '20220817', '20220818', '20220819', '20220820', '20220821', '20220822', '20220823', '20220824', '20220825', '20220826', '20220827', '20220828', '20220829', '20220830', '20220831', '20220901', '20220902', '20220903', '20220904', '20220905', '20220906', '20220907', '20220908', '20220909', '20220910', '20220911', '20220912', '20220913', '20220914', '20220915', '20220916', '20220917', '20220918', '20220919', '20220920', '20220921', '20220922', '20220923', '20220924', '20220925', '20220926', '20220927', '20220928', '20220929', '20220930', '20221001', '20221002', '20221003', '20221004', '20221005', '20221006', '20221007', '20221008', '20221009', '20221010', '20221011', '20221012', '20221013', '20221014', '20221015', '20221016', '20221017', '20221018', '20221019', '20221020', '20221021', '20221022', '20221023', '20221024', '20221025', '20221026', '20221027', '20221028', '20221029', '20221030', '20221031', '20221101', '20221102', '20221103', '20221104', '20221105', '20221106', '20221107', '20221108', '20221109', '20221110', '20221111', '20221112', '20221113', '20221114', '20221115', '20221116', '20221117', '20221118', '20221119', '20221120', '20221121', '20221122', '20221123', '20221124', '20221125', '20221126', '20221127', '20221128', '20221129', '20221130', '20221201', '20221202', '20221203', '20221204', '20221205', '20221206', '20221207', '20221208', '20221209', '20221210', '20221211', '20221212', '20221213', '20221214', '20221215', '20221216', '20221217', '20221218', '20221219', '20221220', '20221221', '20221222', '20221223', '20221224', '20221225', '20221226', '20221227', '20221228', '20221229', '20221230', '20221231', '20230101', '20230102', '20230103', '20230104', '20230105', '20230106', '20230107', '20230108', '20230109', '20230110', '20230111', '20230112', '20230113', '20230114', '20230115', '20230116', '20230117', '20230118', '20230119', '20230120', '20230121', '20230122', '20230123', '20230124', '20230125', '20230126', '20230127', '20230128', '20230129', '20230130', '20230131', '20230201', '20230202', '20230203', '20230204', '20230205', '20230206', '20230207', '20230208', '20230209', '20230210', '20230211', '20230212', '20230213', '20230214', '20230215', '20230216', '20230217', '20230218', '20230219', '20230220', '20230221', '20230222', '20230223', '20230224', '20230225', '20230226', '20230227', '20230228', '20230301', '20230302', '20230303', '20230304', '20230305', '20230306', '20230307', '20230308', '20230309', '20230310', '20230311', '20230312', '20230313', '20230314', '20230315', '20230316', '20230317', '20230318', '20230319', '20230320', '20230321', '20230322', '20230323', '20230324', '20230325', '20230326', '20230327', '20230328', '20230329', '20230330', '20230331', '20230401', '20230402', '20230403', '20230404', '20230405', '20230406', '20230407', '20230408', '20230409', '20230410', '20230411', '20230412', '20230413', '20230414', '20230415', '20230416', '20230417', '20230418', '20230419', '20230420', '20230421', '20230422', '20230423', '20230424', '20230425', '20230426', '20230427', '20230428', '20230429', '20230430', '20230501', '20230502', '20230503', '20230504', '20230505', '20230506', '20230507', '20230508', '20230509', '20230510', '20230511', '20230512', '20230513', '20230514', '20230515', '20230516', '20230517', '20230518', '20230519', '20230520', '20230521', '20230522', '20230523', '20230524', '20230525', '20230526', '20230527', '20230528', '20230529', '20230530', '20230531', '20230601', '20230602', '20230603', '20230604', '20230605', '20230606', '20230607', '20230608', '20230609', '20230610', '20230611', '20230612', '20230613', '20230614', '20230615', '20230616', '20230617', '20230618', '20230619', '20230620', '20230621', '20230622', '20230623', '20230624', '20230625', '20230626', '20230627', '20230628', '20230629', '20230630', '20230701', '20230702', '20230703', '20230704', '20230705', '20230706', '20230707', '20230708', '20230709', '20230710', '20230711', '20230712', '20230713', '20230714', '20230715', '20230716', '20230717', '20230718', '20230719', '20230720', '20230721', '20230722', '20230723', '20230724', '20230725', '20230726', '20230727', '20230728', '20230729', '20230730', '20230731', '20230801', '20230802', '20230803', '20230804', '20230805', '20230806', '20230807', '20230808', '20230809', '20230810', '20230811', '20230812', '20230813', '20230814', '20230815', '20230816', '20230817', '20230818', '20230819', '20230820', '20230821', '20230822', '20230823', '20230824', '20230825', '20230826', '20230827', '20230828', '20230829', '20230830', '20230831', '20230901', '20230902', '20230903', '20230904', '20230905', '20230906', '20230907', '20230908', '20230909', '20230910', '20230911', '20230912', '20230913', '20230914', '20230915', '20230916', '20230917', '20230918', '20230919', '20230920', '20230921', '20230922', '20230923', '20230924', '20230925', '20230926', '20230927', '20230928', '20230929', '20230930', '20231001', '20231002', '20231003', '20231004', '20231005', '20231006', '20231007', '20231008', '20231009', '20231010', '20231011', '20231012', '20231013', '20231014', '20231015', '20231016', '20231017', '20231018', '20231019', '20231020', '20231021', '20231022', '20231023', '20231024', '20231025', '20231026', '20231027', '20231028', '20231029', '20231030', '20231031', '20231101', '20231102', '20231103', '20231104', '20231105', '20231106', '20231107', '20231108', '20231109', '20231110', '20231111', '20231112', '20231113', '20231114', '20231115', '20231116', '20231117', '20231118', '20231119', '20231120', '20231121', '20231122', '20231123', '20231124', '20231125', '20231126', '20231127', '20231128', '20231129', '20231130', '20231201', '20231202', '20231203', '20231204', '20231205', '20231206', '20231207', '20231208', '20231209', '20231210', '20231211', '20231212', '20231213', '20231214', '20231215', '20231216', '20231217', '20231218', '20231219', '20231220', '20231221', '20231222', '20231223', '20231224', '20231225', '20231226', '20231227', '20231228', '20231229', '20231230', '20231231', '20240101', 查詢?nèi)掌诜秶?----->測(cè)試結(jié)束 0103 912300 20210103032000 2021年01月03日03時(shí)20分00秒000毫秒上午(1-7=>周一-周日)7 星期日 1季度 2021年07月08日11時(shí)00分00秒000毫秒上午(1-7=>周一-周日)4 星期四 3季度 2020年02月29日00時(shí)00分00秒000毫秒上午(1-7=>周一-周日)6 星期六 1季度
工具類
package zj.date.util; import java.io.File; import java.io.Serializable; import java.net.InetAddress; import java.net.URL; import java.net.URLConnection; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Logger; import zj.cache.util.EhCacheUtil; import zj.check.util.CheckUtil; import zj.common.exception.ServiceException; import zj.date.bean.TradeDate; import zj.io.util.FileUtil; import zj.java.util.JavaUtil; import zj.type.TypeUtil; /** * * 日期工具類 * <p> * 一般,在項(xiàng)目中,我們會(huì)會(huì)經(jīng)常使用到日期的各種方式的處理,在各個(gè)業(yè)務(wù)邏輯操作中,都需要相關(guān)的日期操作, 因此,實(shí)現(xiàn)項(xiàng)目中的日期工具類的提出,還是十分重要的,下面,就項(xiàng)目中常用到的日期的相關(guān)操作方式, 做了一個(gè)小的工具類,幾乎包含所有的日期操作了,方便項(xiàng)目使用,也方便以后的復(fù)用和查詢.下面見代碼: * </p> * * @version 1.00 (2014.09.15) * @author SHNKCS 張軍 {@link <a target=_blank href="http://www.sfpk123.com">上海加盾信息科技有限公司</a> <a target=_blank href="http://www.sfpk123.com">張軍個(gè)人網(wǎng)站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">張軍QQ空間</a>} * */ public class DateUtil implements Serializable { private static final long serialVersionUID = 1L; private transient static final Logger log = Logger.getLogger(DateUtil.class); public static final String EHCACHE_HOLIDAY_DATE = "holidayDate"; /** * 獲取域名IP * * @return */ public static String ipByDomain(String P_url) { try { if (P_url.startsWith("https://")) { P_url = P_url.substring("https://".length()); } if (P_url.startsWith("http://")) { P_url = P_url.substring("http://".length()); } InetAddress R_ia = InetAddress.getByName(P_url); return R_ia.getHostAddress(); } catch (Exception e) { throw new RuntimeException("[錯(cuò)誤] 獲取域名IP", e); } } /** * 判斷域名是否是指定IP地址 * * @param P_url * 域名 * @param P_ip * IP地址 * @return */ public static boolean ipCheckByDomain(String P_url, String P_ip) { try { String R_ip = ipByDomain(P_url); return R_ip.equals(P_ip); } catch (Exception e) { throw new RuntimeException("[錯(cuò)誤] 判斷域名是否是指定IP地址", e); } } /** * 獲取指定網(wǎng)站的日期時(shí)間 * * @param P_url * 域名 * @return 日期 */ public static Date ipDate(String P_url) { return ipDate(P_url, null); } /** * 獲取指定網(wǎng)站的日期時(shí)間 * * @param P_url * 域名 * @param P_ip * IP地址 * @return 日期 */ public static Date ipDate(String P_url, String P_ip) { try { if (CheckUtil.isNotNull(P_ip) && !ipCheckByDomain(P_url, P_ip)) { // 如果為映射IP,則不行 return null; } if (!P_url.startsWith("https://") && !P_url.startsWith("http://")) { P_url = "http://" + P_url; } // 取得資源對(duì)象 URL url = new URL(P_url); // 生成連接對(duì)象 URLConnection uc = url.openConnection(); uc.connect();// 發(fā)出連接 long ld = uc.getDate();// 讀取網(wǎng)站日期時(shí)間 Date date = new Date(ld);// 轉(zhuǎn)換為標(biāo)準(zhǔn)時(shí)間對(duì)象 // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);// 輸出北京時(shí)間 // return sdf.format(date); return date; } catch (Exception e) { return null; } } // =====================================================交易日====================================== // DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA); // String value = "'" + formatter.format(new Date()) + "'"; // System.out.println(value); // /** // * 初使化節(jié)假日數(shù)據(jù) // * // * @param conn // * 數(shù)據(jù)庫(kù)連接 // * @return // */ // public static void cacheHoliday(Connection conn) { // Map<String, String> holidayMap = new HashMap<String, String>(); // PreparedStatement psQuery = null; // ResultSet rs = null; // try { // String sql = "select date_format(a.c_date,'%Y%m%d') c_date,a.c_desc from dc_trade_date a where a.is_trade_date=2"; // psQuery = conn.prepareStatement(sql); // rs = psQuery.executeQuery(); // while (rs.next()) { // holidayMap.put(rs.getString(1), rs.getString(2)); // } // EhCacheUtil.put(Constant.EHCACHE_HOLIDAY_DATE, holidayMap); // logger.info("緩存節(jié)假日數(shù)據(jù)成功:" + holidayMap.size()); // } catch (Exception e) { // throw new ServiceException(e); // } finally { // JdbcUtil.closeDB(rs, psQuery); // } // } /** * 取上一個(gè)交易日 * * @param td * 參數(shù)信息 * @return */ public static final Date preTradeDate() { TradeDate td = new TradeDate(); td.beforeCurrent = true; return tradeDate(td); } /** * 取下一個(gè)交易日 * * @param td * 參數(shù)信息 * @return */ public static final Date nextTradeDate() { TradeDate td = new TradeDate(); td.beforeCurrent = false; return tradeDate(td); } /** * 取交易日[不包含當(dāng)前日期] * * @param td * 參數(shù)信息 * @return */ public static final Date tradeDate(TradeDate td) { Map<String, String> holidayMap = EhCacheUtil.get(EHCACHE_HOLIDAY_DATE); if (holidayMap == null || holidayMap.size() == 0) { throw new ServiceException("未初使化交易日文件,請(qǐng)執(zhí)行DateUtil.initTradeDate(file)"); } /** 當(dāng)前日期 **/ if (td.current == null) { td.current = new Date(); } Date current = td.current; // ========================================== /** 類型[默認(rèn)0:天,1:周,2:月,3:季度,4:年] **/ int type = td.type; /** 當(dāng)前日期前后,默認(rèn)前(和類型做匹配使用) **/ boolean beforeCurrent = td.beforeCurrent; // ========================================== /** 交易日前后,默認(rèn)前 **/ boolean beforeTradeDate = td.beforeTradeDate; // ========================================== /** 遞歸次數(shù) **/ int recursionCount = td.recursionCount; // 首先取上一個(gè)日期 if (type == 1) { // 加減7天 current = DateUtil.addDay(current, beforeCurrent ? -7 : 7); } else if (type == 2) { // 加減1個(gè)月 current = DateUtil.addMonth(current, beforeCurrent ? -1 : 1); } else if (type == 3) { // 加減3個(gè)月 current = DateUtil.addMonth(current, beforeCurrent ? -3 : 3); } else if (type == 4) { // 加減1年 current = DateUtil.addYear(current, beforeCurrent ? -1 : 1); } else { // 加減1天 current = DateUtil.addDay(current, beforeCurrent ? -1 : 1); } // 交易日前還是后+(1)T日 int addDay = beforeTradeDate ? -1 : 1; // 加一天 while (holidayMap.containsKey(DateUtil.dateParse(current, "yyyyMMdd"))) { // 是否是節(jié)假日 current = DateUtil.addDay(current, addDay); } if (recursionCount <= 1) { return current; } else { td.current = current; td.recursionCount = td.recursionCount - 1; return tradeDate(td); } } /** * 取交易日 * * @param P_date * 交易日 * @param P_nums * T日(正表示T+P_nums或負(fù)表示T-P_nums) * @return */ public static final Date tradeDate(Date P_date, int P_nums) { Map<String, String> holidayMap = EhCacheUtil.get(EHCACHE_HOLIDAY_DATE); if (holidayMap == null || holidayMap.size() == 0) { throw new ServiceException("未初使化交易日文件,請(qǐng)執(zhí)行DateUtil.initTradeDate(file)"); } // 臨時(shí)變量 Date V_current = P_date; int addDay = 0; if (P_nums > 0) { // 往后推 addDay = 1; } else if (P_nums < 0) { // 往前推 addDay = -1; } else { // 不處理 return P_date; } // 取絕對(duì)值 P_nums = Math.abs(P_nums); while (P_nums > 0) { // 加減一天,判斷是否是交易日 V_current = DateUtil.addDay(V_current, addDay); if (holidayMap.containsKey(DateUtil.dateParse(V_current, "yyyyMMdd"))) { // 是節(jié)假日 } else { // 是交易日(表示V_current日期可以返回) P_nums--; } } return V_current; } /** * 是否是交易日 * * @param current * 日期 * @return */ public static final boolean isTradeDate(Date current) { Map<String, String> holidayMap = EhCacheUtil.get(EHCACHE_HOLIDAY_DATE); if (holidayMap.containsKey(DateUtil.dateParse(current, "yyyyMMdd"))) { return false; } return true; } /** * 初使化交易日數(shù)據(jù) * * @param holidayMap * 交易日數(shù)據(jù) */ public static final void initTradeDate(Map<String, String> holidayMap) { EhCacheUtil.put(EHCACHE_HOLIDAY_DATE, holidayMap); } /** * 初使化交易日數(shù)據(jù) * * @param tradeDateFilePath * 交易日文件 */ public static final void initTradeDate(String tradeDateFilePath) { try { // 測(cè)試股票 // System.out.println(DateUtil.class.getResource("/trade_dates.txt").getPath()); // String file = "/versionManager/sources/java/zj-model/integration/tools/src/main/resources/trade_dates.txt"; Set<String> holidays = new HashSet<String>(); Map<String, String> holidayMap = new HashMap<String, String>(); FileUtil.readLines(holidays, new File(tradeDateFilePath)); for (String v : holidays) { String[] vs = JavaUtil.split(v, "\t"); if (vs.length == 2) { // System.out.println(vs[0] + ":" + vs[1]); holidayMap.put(vs[0], vs[1]); } } EhCacheUtil.put(EHCACHE_HOLIDAY_DATE, holidayMap); } catch (Exception e) { log.error("初使化交易日錯(cuò)誤"); } } /** * 取交易日 * * @param current * 日期 * @see #tradeDate(TradeDate) * @return */ @Deprecated public static final Date preTradeDate(Date current) { return preTradeDate(current, 1, true); } /** * 取交易日 * * @param current * 日期 * @see #tradeDate(TradeDate) * @return */ @Deprecated public static final Date preTradeDate(Date current, int tDay) { return preTradeDate(current, tDay, true); } /** * 取交易日 * * @param current * 日期 * @see #tradeDate(TradeDate) * @return */ @Deprecated public static final Date preTradeDate(Date current, int tDay, boolean before) { Map<String, String> holidayMap = EhCacheUtil.get(EHCACHE_HOLIDAY_DATE); if (holidayMap == null || holidayMap.size() == 0) { throw new ServiceException("未初使化交易日文件,請(qǐng)執(zhí)行DateUtil.initTradeDate(file)"); } // 首先取上一個(gè)日期 int addDay = before ? -1 : 1; current = DateUtil.addDay(current, addDay); // 加一天 while (holidayMap.containsKey(DateUtil.dateParse(current, "yyyyMMdd"))) { // 是否是節(jié)假日 current = DateUtil.addDay(current, addDay); } if (tDay <= 1) { return current; } else { return preTradeDate(current, tDay - 1, before); } } /** * 獲取交易日集合 * * @param sdate * 日期 * @param preDays * 向前取多少天 * @param diffDays * 相差多少天 * @author zhangjun * @return */ public static List<String> getTradeDates(String sdate, int preDays, int diffDays) { List<String> rdates = new ArrayList<String>(); try { Date date = DateUtil.parseDate(sdate); Map<String, String> holidayDate = EhCacheUtil.get(EHCACHE_HOLIDAY_DATE); // 相差天數(shù) diffDays = diffDays <= 0 ? -1 : -(diffDays + 1); // 總交易日 int totalDays = -diffDays * preDays; // 相隔日期 List<String> dates = new ArrayList<String>(); loop: while (true) { while (true) { // 判斷是否是節(jié)假日 if (!holidayDate.containsKey(DateUtil.dateParse(date, "yyyyMMdd"))) { // 添加交易日 dates.add(DateUtil.dateParse(date, "yyyy-MM-dd")); // 總天數(shù)減1 totalDays--; if (totalDays <= 0) { // 循環(huán)結(jié)束后-1 break loop; } } date = DateUtil.addDay(date, -1); } } // 真實(shí)的交易日 for (int i = 0; i < dates.size(); i = i - diffDays) { rdates.add(dates.get(i)); } // logger.info("-------待計(jì)算的所有交易日------------\n" + dates.size() + ":" + dates); // logger.info("-------計(jì)算相隔后的所有交易日------------\n" + rdates.size() + ":" + rdates); } catch (Exception e) { throw new ServiceException(e); } return rdates; } // =====================================================交易日====================================== /** * 日期類型 * * @author zhangjun * */ public static class DateType implements Serializable { private static final long serialVersionUID = 1L; public static int DATE_TYPE_ALL = 0; public static int DATE_TYPE_y4 = 1; public static int DATE_TYPE_y4_MM = 2; public static int DATE_TYPE_y4_MM_dd = 3; public static int DATE_TYPE_y4_MM_dd_HH = 4; public static int DATE_TYPE_y4_MM_dd_HH_mm = 5; public static int DATE_TYPE_y4_MM_dd_HH_mm_ss = 6; public static int RANGE_TYPE_y = 0; public static int RANGE_TYPE_M = 1; public static int RANGE_TYPE_d = 2; public static int RANGE_TYPE_H = 3; public static int RANGE_TYPE_m = 4; public static int RANGE_TYPE_s = 5; } /** * 星期標(biāo)識(shí)1-7=>周一-周日 */ public static enum Weekday { MONDAY("1", "星期一"), TUESDAY("2", "星期二"), WEDNESDAY("3", "星期三"), THURSDAY("4", "星期四"), FRIDAY("5", "星期五"), SATURDAY("6", "星期六"), SUNDAY("7", "星期日"); private final String value; public String getValue() { return value; } private final String name; public String getName() { return name; } Weekday(String value, String name) { this.value = value; this.name = name; } // 普通方法 public static String getName(String value) { for (Weekday entity : Weekday.values()) { if (entity.getValue().equals(value)) { return entity.name; } } return "未知"; } } /** * 獲取星期幾 * * @param w * 星期標(biāo)識(shí)1-7=>周一-周日 * @return */ public static final String getDescWeekday(int w) { switch (w) { case 1: return "星期一"; case 2: return "星期二"; case 3: return "星期三"; case 4: return "星期四"; case 5: return "星期五"; case 6: return "星期六"; case 7: return "星期日"; default: return ""; } } /** * 獲取星期幾 * * @param w * 星期標(biāo)識(shí)0-6=>周日-周六 * @return */ public static final String getDescWeekday(String w) { return getDescWeekday(TypeUtil.Primitive.intValue(w)); } /** * 字符串轉(zhuǎn)日期 * * @param dt * 日期字符串 * @return 日期對(duì)象 */ public static Date parseDate(String dt) { return parseDate(dt, DateType.DATE_TYPE_ALL); } /** * 字符串轉(zhuǎn)日期 * * @param dt * 日期字符串 * @param dateType * 日期類型 * @see DateType * @return 日期對(duì)象 */ public static Date parseDate(String dt, int dateType) { Date rd = null; try { if (dt == null || dt == "") { log.warn("日期不能為:" + dt); } else { boolean isFail = false; String _val_format = "【" + dt + "】不是一個(gè)有效的日期格式\n支持日期格式如下:\n"; if (dateType == DateType.DATE_TYPE_y4) { _val_format += "【yyyy】"; } else if (dateType == DateType.DATE_TYPE_y4_MM) { _val_format += "【yyyyMM或yyyy-MM或yyyy/MM或yyyy MM】"; } else if (dateType == DateType.DATE_TYPE_y4_MM_dd) { _val_format += "【yyyyMMdd或yyyy-MM-dd或yyyy/MM/dd或yyyy MM dd】"; } else if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH) { _val_format += "【yyyyMMddhh或yyyy-MM-dd hh或yyyy/MM/dd hh或yyyy MM dd hh】"; } else if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm) { _val_format += "【yyyyMMddhhmm或yyyy-MM-dd hh:mm或yyyy/MM/dd hh:mm或yyyy MM dd hh:mm】"; } else if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm_ss) { _val_format += "【yyyyMMddhhmmss或yyyy-MM-dd hh:mm:ss或yyyy/MM/dd hh:mm:ss或yyyy MM dd hh:mm:ss】"; } else { dateType = DateType.DATE_TYPE_ALL; _val_format += "【yyyy】"; _val_format += "【yyyyMM或yyyy-MM或yyyy/MM或yyyy MM】"; _val_format += "【yyyyMMdd或yyyy-MM-dd或yyyy/MM/dd或yyyy MM dd】"; _val_format += "【yyyyMMddhh或yyyy-MM-dd hh或yyyy/MM/dd hh或yyyy MM dd hh】"; _val_format += "【yyyyMMddhhmm或yyyy-MM-dd hh:mm或yyyy/MM/dd hh:mm或yyyy MM dd hh:mm】"; _val_format += "【yyyyMMddhhmmss或yyyy-MM-dd hh:mm:ss或yyyy/MM/dd hh:mm:ss或yyyy MM dd hh:mm:ss】"; } String datePat = ""; datePat = "^(\\d{4})(/|-| )(\\d{1,2})(\\2)([0-9]{1,2}) (\\d{1,2}):(\\d{1,2}):(\\d{1,2})$"; Matcher mt = Pattern.compile(datePat).matcher(dt); String year = ""; String month = ""; String day = ""; String hour = ""; String minute = ""; String second = ""; if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm_ss || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = mt.group(3); day = mt.group(5); hour = mt.group(6); minute = mt.group(7); second = mt.group(8); } else { isFail = true; } } else { datePat = "^(\\d{14})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm_ss || dateType == DateType.DATE_TYPE_ALL) { year = dt.substring(0, 4); month = dt.substring(4, 6); day = dt.substring(6, 8); hour = dt.substring(8, 10); minute = dt.substring(10, 12); second = dt.substring(12, 14); } else { isFail = true; } } else { datePat = "^(\\d{4})(/|-| )(\\d{1,2})(\\2)(\\d{1,2}) (\\d{1,2}):(\\d{1,2})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = mt.group(3); day = mt.group(5); hour = mt.group(6); minute = mt.group(7); second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{12})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm || dateType == DateType.DATE_TYPE_ALL) { year = dt.substring(0, 4); month = dt.substring(4, 6); day = dt.substring(6, 8); hour = dt.substring(8, 10); minute = dt.substring(10, 12); second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{4})(/|-| )(\\d{1,2})(\\2)(\\d{1,2}) (\\d{1,2})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = mt.group(3); day = mt.group(5); hour = mt.group(6); minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{10})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH || dateType == DateType.DATE_TYPE_ALL) { year = dt.substring(0, 4); month = dt.substring(4, 6); day = dt.substring(6, 8); hour = dt.substring(8, 10); minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{4})(/|-| )(\\d{1,2})(\\2)(\\d{1,2})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = mt.group(3); day = mt.group(5); hour = "0"; minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{8})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd || dateType == DateType.DATE_TYPE_ALL) { year = dt.substring(0, 4); month = dt.substring(4, 6); day = dt.substring(6, 8); hour = "0"; minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{4})(/|-| )(\\d{1,2})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = mt.group(3); day = "1"; hour = "0"; minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{6})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM || dateType == DateType.DATE_TYPE_ALL) { year = dt.substring(0, 4); month = dt.substring(4, 6); day = "1"; hour = "0"; minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{4})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4 || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = "1"; day = "1"; hour = "0"; minute = "0"; second = "0"; } else { isFail = true; } } else { _val_format = "【" + dt + "】不是一個(gè)有效的日期格式"; isFail = true; } } } } } } } } } } } if (isFail) { log.warn(_val_format); } else { int iyear = Integer.parseInt(year); int imonth = Integer.parseInt(month); int iday = Integer.parseInt(day); int ihour = Integer.parseInt(hour); int iminute = Integer.parseInt(minute); int isecond = Integer.parseInt(second); if (iyear < 1 || iyear > 9999) { _val_format = "年份必須在0001-9999之間"; isFail = true; } if (imonth < 1 || imonth > 12) { _val_format = "月份必須在01-12之間"; isFail = true; } if (iday < 1 || iday > 31) { _val_format = "天數(shù)必須在01-31之間"; isFail = true; } if ((imonth == 4 || imonth == 6 || imonth == 9 || imonth == 11) && iday == 31) { _val_format = month + "月不能有31天!"; isFail = true; } if (imonth == 2) { boolean isleap = (iyear % 4 == 0 && iyear % 100 != 0) || iyear % 400 == 0; if (isleap) { if (iday > 29) { _val_format = "閏年[" + year + "]年的2月不能有[" + day + "]天!"; isFail = true; } } else { if (iday > 28) { _val_format = "平年[" + year + "]年的2月不能有[" + day + "]天!"; isFail = true; } } } if (ihour < 0 || ihour > 23) { _val_format = "小時(shí)必須在00-23之間"; isFail = true; } if (iminute < 0 || iminute > 59) { _val_format = "分鐘必須在00-59之間"; isFail = true; } if (isecond < 0 || isecond > 59) { _val_format = "秒鐘必須在00-59之間"; isFail = true; } if (isFail) { log.warn(_val_format); } else { // //("調(diào)試字符串如下【開始】\n" + sb.toString() + "\n調(diào)試字符串如下【結(jié)束】"); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(0); calendar.set(iyear, imonth - 1, iday, ihour, iminute, isecond); rd = calendar.getTime(); } } } } catch (Exception e) { rd = null; log.error(e.getMessage()); } return rd; } /** * 日期解析字符串 * * @param odt * 日期對(duì)象 * @return 返回格式化后的日期字符串,如果出錯(cuò)返回當(dāng)前日期對(duì)象 */ public static String dateParse(Object odt) { return dateParse(odt, null); } /** * 日期解析字符串 * * @param odt * 日期對(duì)象 * @param partten * 日期格式 * <p> * yyyy年MM月dd日HH時(shí)mm分ss秒SSS毫秒p(1-7=>周一-周日)w x q季度 * </p> * @return 返回格式化后的日期字符串,如果出錯(cuò)返回當(dāng)前日期對(duì)象 */ public static String dateParse(Object odt, String partten) { try { if (odt == null) return ""; Date dt = null; if (odt instanceof Date) { dt = (Date) odt; } else if (odt instanceof Timestamp) { Timestamp ts = (Timestamp) odt; dt = new Date(ts.getTime()); } else if (odt instanceof Calendar) { Calendar cal = (Calendar) odt; dt = cal.getTime(); } else if (odt instanceof String) { dt = parseDate(String.valueOf(odt)); if (dt == null) { log.error("無(wú)效的日期:" + odt); return ""; } } else { log.error("無(wú)效的日期:" + odt); return String.valueOf(odt); } return getParseDt(dt, partten); } catch (Exception e) { log.error(e.getMessage()); return String.valueOf(odt); } } /** * 日期解析字符串 * * @param dt * 日期對(duì)象 * @param partten * 日期格式 * <p> * yyyy年MM月dd日HH時(shí)mm分ss秒SSS毫秒p(1-7=>周一-周日)w x q季度 * </p> * @return 返回格式化后的日期字符串,如果出錯(cuò)返回當(dāng)前日期對(duì)象 */ public static String getParseDt(Date dt, String partten) { if (dt == null) return ""; if (partten == null || "".equals(partten)) { partten = "yyyy年MM月dd日HH時(shí)mm分ss秒SSS毫秒p(1-7=>周一-周日)w x q季度"; } Calendar cal = Calendar.getInstance(); cal.setTime(dt); String year = "" + cal.get(Calendar.YEAR); String month = "" + (cal.get(Calendar.MONTH) + 1); String day = "" + cal.get(Calendar.DATE); String hour = "" + cal.get(Calendar.HOUR_OF_DAY); String minute = "" + cal.get(Calendar.MINUTE); String second = "" + cal.get(Calendar.SECOND); String millisecond = "" + cal.get(Calendar.MILLISECOND); // 星期標(biāo)識(shí)【0-6=>周日-周六】=>返回【1-7=>周一-周日】 int week_of_month = cal.get(Calendar.DAY_OF_WEEK) - 1; // 星期值 String ws = ""; switch (week_of_month) { case 1: ws += "1"; break; case 2: ws += "2"; break; case 3: ws += "3"; break; case 4: ws += "4"; break; case 5: ws += "5"; break; case 6: ws += "6"; break; case 0: ws += "7"; break; default: ws = ""; break; } // 上下午 int r = cal.get(Calendar.AM_PM); String ap = ""; if (r == Calendar.AM) { ap = "上午"; } if (r == Calendar.PM) { ap = "下午"; } // 季度值 int tempMonth = TypeUtil.Primitive.intValue(month); // quarter季度 String q = ""; if (tempMonth >= 1 && tempMonth <= 3) { q = "1"; } else if (tempMonth >= 4 && tempMonth <= 6) { q = "2"; } else if (tempMonth >= 7 && tempMonth <= 9) { q = "3"; } else if (tempMonth >= 10 && tempMonth <= 12) { q = "4"; } String matStr = ""; // 替換4位年 matStr = "(y|Y){4}"; Matcher mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(year, "0", 4)); // 替換2位月 matStr = "M{2}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(month, "0", 2)); // 替換季度 matStr = "(q|Q)"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(q); // 替換2位天 matStr = "d{2}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(day, "0", 2)); // 替換2位小時(shí) matStr = "(h|H){2}(24)?"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(hour, "0", 2)); // 替換2位分 matStr = "m{2}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(minute, "0", 2)); // 替換2位秒 matStr = "s{2}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(second, "0", 2)); // 替換3位毫秒 matStr = "S{3}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(millisecond, "0", 3)); // 替換星期 matStr = "w|W"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(ws); // 替換星期 matStr = "x|X"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(getDescWeekday(ws)); // 替換上下午 matStr = "p|P"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(ap); // 替換2位年 matStr = "(y|Y){2}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(year.length() > 2 ? year.substring(year.length() - 2, year.length()) : year); // 替換1位月 matStr = "M"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(month); // 替換1位天 matStr = "d"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(day); // 替換1位小時(shí) matStr = "(h|H){1}(12)?"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR((Integer.parseInt(hour) > 12 ? "" + Math.abs(Integer.parseInt(hour) - 12) : hour), "0", 2)); // matStr = "(h|H)12"; // mt = Pattern.compile(matStr).matcher(partten); // partten = mt.replaceAll(Integer.parseInt(hour) > 12 ? "" + Math.abs(Integer.parseInt(hour) - 12) : hour); // matStr = "(h|H)24"; // mt = Pattern.compile(matStr).matcher(partten); // partten = mt.replaceAll(hour); // 替換1位分 matStr = "m"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(minute); // 替換1位秒 matStr = "s"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(second); // 替換1位毫秒 matStr = "S"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(millisecond); // 最終結(jié)果 return partten; } /** * 數(shù)字前補(bǔ)0可以補(bǔ)"0"也可以補(bǔ)"" * * @param oldStr * 舊字符串 * @param addStr * 添加字符串 * @param strLength * 字符長(zhǎng)度 * @param isLeft * <p> * true:左補(bǔ)字符 * </p> * <p> * false:右補(bǔ)字符 * </p> * @author zhangjun * @return 重組后的數(shù)據(jù) */ public static String addForLR(String oldStr, String addStr, int strLength, boolean isLeft) { if (oldStr == null || addStr == null) return oldStr; int strLen = oldStr.length(); if (strLen < strLength) { while (strLen < strLength) { StringBuffer sb = new StringBuffer(); if (isLeft) { sb.append(addStr).append(oldStr); } else { sb.append(oldStr).append(addStr); } oldStr = sb.toString(); strLen = oldStr.length(); } } return oldStr; } /** * 數(shù)字前補(bǔ)0可以補(bǔ)"0"也可以補(bǔ)"" * * @param oldStr * 舊字符串 * @param addStr * 添加字符串 * @param strLength * 字符長(zhǎng)度 * @author zhangjun * @return 重組后的數(shù)據(jù) */ public static String addForLR(String oldStr, String addStr, int strLength) { return addForLR(oldStr, addStr, strLength, true); } /** * 計(jì)算日期范圍 * * @param startTime * 開始日期對(duì)象 * @param endTime * 結(jié)束日期對(duì)象 * @param rangeType * 范圍類型 * @param ymdhms * 年月日時(shí)分秒 * @param dateType * 日期類型 */ public static String dateRangeFlg(Object startTime, Object endTime, int rangeType, int ymdhms, int dateType) { String sstartTime = startTime == null ? "" : String.valueOf(startTime); String sendTime = endTime == null ? "" : String.valueOf(endTime); String rtn_1 = "1"; String rtn_2 = "2"; String rtn_3 = "3"; String rtn_4 = "4"; String rtn_5 = "5"; String rtn_6 = "6"; try { if ("".equals(sstartTime)) { return rtn_4; } if ("".equals(sendTime)) { return rtn_5; } Date checktime1 = null; Date checktime2 = null; if (startTime instanceof Date) { checktime1 = (Date) startTime; } else { checktime1 = parseDate(sstartTime, dateType); } if (checktime1 == null) { return rtn_4; } if (endTime instanceof Date) { checktime2 = (Date) endTime; } else { checktime2 = parseDate(sendTime, dateType); } if (checktime2 == null) { return rtn_5; } if (startTime == "" || endTime == "") return ""; Calendar cal1 = Calendar.getInstance(); cal1.setTimeInMillis(0); cal1.setTime(checktime1); Calendar cal2 = Calendar.getInstance(); cal2.setTimeInMillis(0); cal2.setTime(checktime2); long flg = cal2.getTimeInMillis() - cal1.getTimeInMillis(); if (flg < 0) { // //("開始時(shí)間不能大于結(jié)束時(shí)間!"); return rtn_6; } if (rangeType == DateType.RANGE_TYPE_y) { cal1.set(Calendar.YEAR, cal1.get(Calendar.YEAR) + ymdhms); // v_typeMsg = "年"; } else if (rangeType == DateType.RANGE_TYPE_M) { cal1.set(Calendar.MONTH, cal1.get(Calendar.MONTH) + ymdhms); // v_typeMsg = "個(gè)月"; } else if (rangeType == DateType.RANGE_TYPE_d) { cal1.set(Calendar.DATE, cal1.get(Calendar.DATE) + ymdhms); // v_typeMsg = "天"; } else if (rangeType == DateType.RANGE_TYPE_H) { cal1.set(Calendar.HOUR_OF_DAY, cal1.get(Calendar.HOUR_OF_DAY) + ymdhms); // v_typeMsg = "小時(shí)"; } else if (rangeType == DateType.RANGE_TYPE_m) { cal1.set(Calendar.MINUTE, cal1.get(Calendar.MINUTE) + ymdhms); // v_typeMsg = "分鐘"; } else if (rangeType == DateType.RANGE_TYPE_s) { cal1.set(Calendar.SECOND, cal1.get(Calendar.SECOND) + ymdhms); // v_typeMsg = "秒鐘"; } else { // //("類型值不正確,請(qǐng)看下面提示\ny:年,m1:月,d:日,h:時(shí),m2:分,s:秒"); return rtn_3; } flg = cal2.getTimeInMillis() - cal1.getTimeInMillis(); if (flg > 0) { // //("開始時(shí)間和結(jié)束時(shí)間相差不能超過" + ymdhms + v_typeMsg + "!"); return rtn_1; } else { return rtn_2; } } catch (Exception e) { return rtn_3; } } /** * Calendar 轉(zhuǎn)換為 Date * * @return date日期 */ public static Date calToDate() { // (1) Calendar轉(zhuǎn)化為Date Calendar cal = Calendar.getInstance(); return calToDate(cal); } /** * Calendar 轉(zhuǎn)換為 Date * * @param cal * Calendar日期 * @return date日期 */ public static Date calToDate(Calendar cal) { // (1) Calendar轉(zhuǎn)化為Date Date date = cal.getTime(); return date; } /** * Date 轉(zhuǎn)換為 Calendar * * @return Calendar日期 */ public static Calendar dateToCal() { // (2) Date轉(zhuǎn)化為Calendar Date date = new Date(); return dateToCal(date); } /** * Date 轉(zhuǎn)換為 Calendar * * @param date * date日期 * @return Calendar日期 */ public static Calendar dateToCal(Date date) { // (2) Date轉(zhuǎn)化為Calendar Calendar cal = Calendar.getInstance(); cal.setTime(date); return cal; } /** * 相差x年又y天 * * @param sd * 開始日期 * @param ed * 結(jié)束日期 * @author 張軍 * @date 2015-11-03 21:59:00 * @modifiyNote * @version 1.0 * @return * */ public static String diffYearAndDay(Date startDate, Date endDate) { if (startDate == null || endDate == null) { return "?天"; } long diffDate = DateUtil.diffDay(startDate, endDate); int year = 0; while (diffDate > 365) { diffDate -= 365; year++; } if (year > 0) { return year + "年又" + diffDate + "天"; } else { return diffDate + "天"; } } /** * 相差日-秒 * * @param sd * 開始日期 * @param ed * 結(jié)束日期 * @return 返回值為:{天, 時(shí), 分, 秒} */ public static long[] diffDayToSecond(Date sd, Date ed) { Date newSd = new Date(sd.getTime()); Date newEd = new Date(ed.getTime()); long diff = newEd.getTime() - newSd.getTime(); long day = 0; long hour = 0; long min = 0; long sec = 0; day = diff / (24 * 60 * 60 * 1000); hour = (diff / (60 * 60 * 1000) - day * 24); min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60); sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); long[] times = { day, hour, min, sec }; return times; } /** * 相差日 * * @param sd * 開始日期 * @param ed * 結(jié)束日期 * @return 相差值 */ public static long diffDay(Date sd, Date ed) { Date newSd = new Date(sd.getTime()); Date newEd = new Date(ed.getTime()); long diff = newEd.getTime() - newSd.getTime(); return diff / (24 * 60 * 60 * 1000); } /** * 加日 * * @param d * 日期 * @param day * 天數(shù) * @return 計(jì)算后的日期 */ public static Date addDay(Date d, int day) { Date newD = new Date(d.getTime()); newD.setTime(newD.getTime() + (long) day * 86400000L); return newD; } /** * 加月 * * @param d * 日期 * @param month * 月數(shù) * @return 計(jì)算后的日期 */ public static Date addMonth(Date d, int month) { Date newD = new Date(d.getTime()); GregorianCalendar gval = new GregorianCalendar(); gval.setTime(newD); gval.add(2, month); newD.setTime(gval.getTime().getTime()); return newD; } /** * 加年 * * @param d * 日期 * @param year * 年數(shù) * @return 計(jì)算后的日期 */ public static Date addYear(Date d, int year) { Date newD = new Date(d.getTime()); GregorianCalendar gval = new GregorianCalendar(); gval.setTime(newD); gval.add(1, year); newD.setTime(gval.getTime().getTime()); return newD; } /** * 相差時(shí) * * @param sd * 開始日期 * @param ed * 結(jié)束日期 * @return 相差值 */ public static long diffHour(Date sd, Date ed) { Date newSd = new Date(sd.getTime()); Date newEd = new Date(ed.getTime()); long diff = newEd.getTime() - newSd.getTime(); return diff / (60 * 60 * 1000); } /** * 加小時(shí) * * @param d * 日期 * @param hour * 小時(shí)數(shù) * @return 計(jì)算后的日期 */ public static Date addHour(Date d, int hour) { Date newD = new Date(d.getTime()); newD.setTime(newD.getTime() + (long) hour * 3600000L); return newD; } /** * 相差分 * * @param sd * 開始日期 * @param ed * 結(jié)束日期 * @return 相差值 */ public static long diffMinute(Date sd, Date ed) { Date newSd = new Date(sd.getTime()); Date newEd = new Date(ed.getTime()); long diff = newEd.getTime() - newSd.getTime(); return diff / (60 * 1000); } /** * 加分 * * @param d * 日期 * @param minute * 分?jǐn)?shù) * @return 計(jì)算后的日期 */ public static Date addMinute(Date d, int minute) { Date newD = new Date(d.getTime()); newD.setTime(newD.getTime() + (long) minute * 60000L); return newD; } /** * 相差秒 * * @param sd * 開始日期 * @param ed * 結(jié)束日期 * @return 相差值 */ public static long diffSecond(Date sd, Date ed) { Date newSd = new Date(sd.getTime()); Date newEd = new Date(ed.getTime()); long diff = newEd.getTime() - newSd.getTime(); return diff / (1000); } /** * 加秒 * * @param d * 日期 * @param second * 秒數(shù) * @return 計(jì)算后的日期 */ public static Date addSecond(Date d, int second) { Date newD = new Date(d.getTime()); newD.setTime(newD.getTime() + (long) second * 1000L); return newD; } /** * 加毫秒 * * @param d * 日期 * @param minSecond * 毫秒數(shù) * @return 計(jì)算后的日期 */ public static Date addMinSecond(Date d, long minSecond) { Date newD = new Date(d.getTime()); newD.setTime(newD.getTime() + minSecond * 1L); return newD; } /** * 將元數(shù)據(jù)前補(bǔ)零,補(bǔ)后的總長(zhǎng)度為指定的長(zhǎng)度,以字符串的形式返回 * * @param sourceData * 源數(shù)據(jù) * @param formatLength * 長(zhǎng)度 * @return 重組后的數(shù)據(jù) */ public static String frontCompWithZore(int sourceData, int formatLength) { /* * 0 指前面補(bǔ)充零 formatLength 字符總長(zhǎng)度為 formatLength d 代表為正數(shù)。 */ String newString = String.format("%0" + formatLength + "d", sourceData); return newString; } /** * 毫秒轉(zhuǎn)時(shí)分秒毫秒 * * @param millis * @author 張軍 * @date 2015-11-03 21:59:00 * @modifiyNote * @version 1.0 * @return */ public static Map<String, Integer> millisToHmsS(int millis) { Map<String, Integer> values = new HashMap<String, Integer>(); // 時(shí) int h = 0; // 分 int m = 0; // 秒 int s = 0; // 毫秒 int S = 0; if (millis <= 1000) { S = millis; } else { int second = millis / 1000; if (millis % 1000 != 0) { // 毫秒數(shù) S = millis % 1000; } if (second > 3600) { // 如果大于3600秒 int temp = second % 3600; h = second / 3600; if (temp != 0) { if (temp > 60) { m = temp / 60; if (temp % 60 != 0) { s = temp % 60; } } else { s = temp; } } } else { // 如果小于等于3600秒 m = second / 60; if (second % 60 != 0) { s = second % 60; } } } // System.out.println(h + "時(shí)" + m + "分" + s + "秒" + S + "毫秒"); values.put("h", h); values.put("m", m); values.put("s", s); values.put("S", S); return values; } }
本文為張軍原創(chuàng)文章,轉(zhuǎn)載無(wú)需和我聯(lián)系,但請(qǐng)注明來(lái)自張軍的軍軍小站,個(gè)人博客http://www.sfpk123.com
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
